Android:具有多个可单击元素的ListView元素

时间:2012-09-04 12:46:53

标签: android android-layout

我有一个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(这是发生按钮点击的列表中的元素)

7 个答案:

答案 0 :(得分: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;
        }

}

答案 1 :(得分:1)

我用这种方式解决了同样的问题: 在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));

答案 2 :(得分:0)

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

答案 3 :(得分:0)

很简单,只需为这两个按钮实施OnClickListener,然后获取getView()的位置,确保将位置设置为final以便将其输入OnClickListener

答案 4 :(得分:0)

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

答案 5 :(得分:0)

不要为listview添加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. } } });

答案 6 :(得分:0)

检查以下代码,它可能对您有帮助。

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();

            }
        };