【问题标题】:Android: ListView elements with multiple clickable elementsAndroid:具有多个可点击元素的 ListView 元素
【发布时间】:2012-09-04 12:46:52
【问题描述】:

我有一个ListView,其中列表中的每个元素都包含一个 TextView 和两个不同的按钮。像这样的:

ListView
--------------------
[ImageView][Text][CheckBox][Button]
--------------------
[ImageView][Text][CheckBox][Button]
--------------------
... (and so on) ...

使用此代码,我可以为整个项目创建一个OnItemClickListener:

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> list, View view, int position, long id) {
        Log.i(TAG, "onListItemClick: " + position);

        }

    }
});

但是,我不希望整个项目都可点击,而只希望每个列表元素的复选框和按钮。

所以我的问题是,如何使用以下参数为这两个按钮实现 onClickListener:

  • int id(与列表中的每个项目关联的一些 id)
  • int position(这是列表中发生按钮单击的元素)

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    你需要制作 baseAdpter 来实现这个

    public class ContactsAdapter extends BaseAdapter {
    
        ArrayList<ContactInfo> mlist;
        Context mcontext;
    
    
    public BluetoothChatadpter(Context context,ArrayList<ChatInfo> mchtlist) {      
            mlist =  mchtlist;
            mcontext = context;
    
        }
    
        @Override
        public int getCount() {
            return mlist.size();
        }
    
        @Override
        public Object getItem(int postion) {
            return mlist.get(postion);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
            public View getView(int position, View convertview, ViewGroup viewgroup){
                View view = null;
                if(convertview == null){
                    LayoutInflater inflater = context.getLayoutInflater();
                    view = inflater.inflate(R.layout.contactrow, null);
    
                    ContactHolder holder = new ContactHolder();
    
                    holder.txtviewfirstname = (TextView)view.findViewById(R.id.firstname);
                    holder.txtviewphone = (TextView)view.findViewById(R.id.phone);
                    holder.chkselected = (CheckBox)view.findViewById(R.id.check);
    
                    setOnClickListener(new OnClickListener() {
            @Override
                public void onClick(View arg0) {
                // to open the selected file in resp
    
                      // do your work here
                     }});
    
    
        chkselected .setOnClickListener(new OnClickListener() {
            @Override
        public void onClick(View v) {
        // Toast.makeText(context,// "checked is clicke="+pos, 12).show();
                if (chkselected.isChecked())          
                           {            
    
                            // do your work here
                } else {
    
         // do your work here                               
                }
            }
    });
    
    
    
                view.setTag(holder);
    
            }
                else{
                    view = convertview;
                }
                ContactHolder holder2 = (ContactHolder) view.getTag();
                holder2.txtviewfirstname.setText(list.get(position).firstname);
                holder2.txtviewphone.setText(list.get(position).phonenumber);
                holder2.chkselected.setChecked(list.get(position).selected);
                return view;
            }
    
    }
    

    【讨论】:

      【解决方案2】:

      我以这种方式解决了同样的问题: 在 ListViewItem 的 layout.xml 中给元素一个标签,您要在其中添加 OnClickListener:

             android:id="@+id/CheckBox"
             android:tag="CheckBox" />
      

      ....

             android:id="@+id/Button"
             android:tag="Button" />
      

      在您的 ListView 被膨胀的代码中,使用以下代码添加 OnClickListener:

             listView.findViewWithTag("CheckBox").setOnClickListener(createCheckBoxOnClickListener(act));
             listView.findViewWithTag("Button").setOnClickListener(createButtonOnClickListener(act));
      

      【讨论】:

        【解决方案3】:

        您必须在适配器的 getView 方法中执行此操作。

        【讨论】:

          【解决方案4】:

          简单,只需为这两个按钮实现OnClickListener,并获取您从getView() 获得的位置,确保将位置设置为final 以便在OnClickListener 中获得它

          【讨论】:

            【解决方案5】:

            您可以在 Adapter 的 getView() 方法中添加监听器。

            【讨论】:

              【解决方案6】:

              不要为列表视图添加 onItemClickListener 而是为您所需的按钮添加 onClick 并为复选框这样做

               CheckBox cbox = new CheckBox(this);// find your checkbox from the view here.
                      cbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
              
                      @Override
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                          // TODO Auto-generated method stub
                          if(isChecked){
                              // do what ever you want.
                          }
                      }
                  });
              

              【讨论】:

                【解决方案7】:

                检查下面的代码可能对你有帮助。

                private class ListViewAdapter extends BaseAdapter {
                
                        private LayoutInflater mInflater;
                
                        public ListViewAdapter(Context con) {
                            // TODO Auto-generated constructor stub
                            mInflater = LayoutInflater.from(con);
                        }
                
                        public int getCount() {
                            // TODO Auto-generated method stub
                            return main_genral_class.review_name.size();
                        }
                
                        public Object getItem(int position) {
                            // TODO Auto-generated method stub
                
                            return position;
                        }
                
                        public long getItemId(int position) {
                            // TODO Auto-generated method stub
                            return position;
                        }
                
                        public View getView(int position, View convertView, ViewGroup parent) {
                            // TODO Auto-generated method stub
                            ListContent holder;
                
                            if (convertView == null) {
                                convertView = mInflater.inflate(R.layout.review_row, null);
                                holder = new ListContent();
                
                                holder.img = (ImageView) convertView
                                        .findViewById(R.id.imageView1);
                                holder.name = (TextView) convertView
                                        .findViewById(R.id.textView1);
                                holder.check_date = (TextView) convertView
                                        .findViewById(R.id.textView2);
                
                
                
                
                                holder.img.setOnClickListener(mOnTitleClickListener);
                                holder.name.setOnClickListener(mOnTitleClickListener1);
                                holder.check_date.setOnClickListener(mOnTitleClickListener2);
                
                
                                convertView.setTag(holder);
                            } else {
                
                                holder = (ListContent) convertView.getTag();
                            }
                
                            holder.text2.setText(main_genral_class.review_shout.get(position));
                            return convertView;
                        }
                    }
                

                private OnClickListener mOnTitleClickListener = new OnClickListener() {
                        public void onClick(View v) {
                            final int position = mListView.getPositionForView((View) v
                                    .getParent());
                
                                Toast.makeText(review_activity.this, "click on Image View",
                                        Toast.LENGTH_SHORT).show();
                
                        }
                    };
                

                private OnClickListener mOnTitleClickListener1 = new OnClickListener() {
                            public void onClick(View v) {
                                final int position = mListView.getPositionForView((View) v
                                        .getParent());
                
                                    Toast.makeText(review_activity.this, "click on Text View",
                                            Toast.LENGTH_SHORT).show();
                
                            }
                        };
                

                private OnClickListener mOnTitleClickListener2 = new OnClickListener() {
                            public void onClick(View v) {
                                final int position = mListView.getPositionForView((View) v
                                        .getParent());
                
                                    Toast.makeText(review_activity.this, "click on Date Text View",
                                            Toast.LENGTH_SHORT).show();
                
                            }
                        };
                

                【讨论】:

                  猜你喜欢
                  • 2010-12-15
                  • 1970-01-01
                  • 2014-10-03
                  • 1970-01-01
                  • 2011-10-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-01-18
                  • 2012-10-29
                  相关资源
                  最近更新 更多