【问题标题】:accessing custom objects in a listview访问列表视图中的自定义对象
【发布时间】:2012-04-23 06:41:46
【问题描述】:

我目前正在构建一个应用程序,该应用程序将请求发送到网络,然后解析结果并将其放入对象的 ArrayList 中。

然后,此列表填充一个 ListView。 我想创建一个onClickListener,让我知道点击了哪个对象,但我找不到正确的实现方法。

要么将 onClick 分配给原始 Activity 中的 ListView,要么在自定义适配器的 getView 函数中分配监听器。

在我看来,在getView 中分配监听器的开销太大。

它是如何工作的?什么更好?

主要活动代码:

public class NoPicList extends Activity {
    ListView list;
    NoPicAdapter adapter;
    ProgressDialog mDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.no_pic_list);
        list = (ListView) findViewById(R.id.noPicListView);

        Bundle b = getIntent().getExtras();
        String request = b.getString("REQUEST");
        mDialog = new ProgressDialog(this);
        mDialog.setCancelable(false);
        mDialog.setMessage("Lodaing Data");
        mDialog.show();

        new GetNewsAndCalendar().execute(request);
    }

    @Override
    protected void onPause() {
        mDialog.dismiss();
        super.onPause();
    }

    class GetNewsAndCalendar extends
        AsyncTask<String, Void, ArrayList<Message>> {

        @Override
        protected ArrayList<Message> doInBackground(String... params) {
            String url = params[0];
            DOMFeedParser parser = new DOMFeedParser(url);
            return parser.parse();
        }

        @Override
        protected void onPostExecute(ArrayList<Message> result) {
            adapter = new NoPicAdapter(NoPicList.this, result);
            list.setAdapter(adapter);
            //FIRST OPTION TO INSERT onClickListener
            mDialog.dismiss();
        }
    }    //end of GetNewsAndCalendar
}

列表适配器代码:

public class NoPicAdapter extends BaseAdapter {

    private ArrayList<Message> data;
    private Activity mActivity;
    private LayoutInflater inflater = null;

    public NoPicAdapter(Activity a, ArrayList<Message> result) {
        mActivity = a;
        data = result;
        inflater = (LayoutInflater) mActivity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = LayoutInflater.from(mActivity).inflate(R.layout.no_pic_list_item,
                null);

        TextView title = (TextView) vi.findViewById(R.id.noPicTitle);
        TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle);

        title.setText(data.get(position).getTitle());
        subtitle.setText(data.get(position).getDate());
    // SECOND PLACE TO INSERT THE onClickListener
        return vi;
    }
}

【问题讨论】:

    标签: android android-listview listadapter onclicklistener


    【解决方案1】:

    根据我的担心,将 onClick 分配给原始活动中的 ListView 是个好主意,而不是将其分配给自定义适配器的 getView()。因为在适配器的getView() 中,它总是创建一个new View.onClick() 的对象..

    list.setOnItemClickListener(new OnItemClickListener()
     {
      @Override
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
      {
       adapter.get(position);  
       // Get data from your adapter,   the above code of line give the custom adapter's object of   current position of selected list item     
      }   
     });  
    

    【讨论】:

    • setOnItemSelectedListener?为了什么?
    • @PareshMayani - 哦,对不起,我的错误是 onItemClickListener.. 谢谢。
    • 我认为onClickListener 无法获得onItemSelectedListener。因此它必须是onItemSelectedListener
    • @MoeJo - 是的,你是对的,只是输入错误,我更正了。
    【解决方案2】:

    同意user370305的回答。

    你只需要在你的Activity类中实现OnItemClickListener,创建后你会得到onItemClick方法,在里面你会得到被点击对象的position

     @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
            // TODO Auto-generated method stub
            MyObject clickedObject = (MyObject) adapter.getItem(position);
            // MyObject is user-defined class
    
        }
    

    【讨论】:

    • adapter.getItem(position); 将返回他的位置变量。看看他的适配器代码..它会抛出类转换异常..
    • @sandy 是的,我只是向他展示了一种实现 OnItemClick 事件的方法,其余部分他应该亲自尝试。
    • @sandy,getItem(position) 马上就要实现了,我还没实现...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2016-07-03
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多