3
votes

I've a ListView where every element in the list contains a TextView and two different Buttons. Something like this:

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

With this code I can create an OnItemClickListener for the whole item:

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

        }

    }
});

However, I don't want the whole item to be clickable, but only the checkbox and the button of each list element.

So my question is, how do I implement a onClickListener for these two buttons with the following parameters:

  • int id (some id associated with each item in list)
  • int position (which is the element in the list on which the button click happened)
7

7 Answers

1
votes

you need to make baseAdpter to achieve this

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
votes

i solved the same problem in this way: in the layout.xml of the ListViewItem give the elements a tag, where you want to add the OnClickListener:

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

....

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

In the code, where your ListView is inflated add the OnClickListener with the following code:

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

You must do this in the getView method in your adapter..

0
votes

easy, just implement the OnClickListener for these two buttons, and get the position that you get from getView(), make sure you set the position to final in order to get it in OnClickListener

0
votes

you can add listeners in your getView() method of Adapter.

0
votes

dont add onItemClickListener for the listview rather add onClick for your required button and for checkbox do it like this

 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.
            }
        }
    });
0
votes

check below code it may help you.

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

            }
        };