Search code examples
androidlisteneradapterandroid-arrayadapteroncheckedchanged

how to add a listener for checkboxes in an adapter view, Android, ArrayAdapter, onCheckedChanged, OnCheckedChangeListener


enter image description here

I have a listView that by way of an ArrayAdapter is populated by small xml sub views. each small view only has two things inside, a checkbox and a string label next to it.

i want to set an onCheckedChanged listener to capture the event of the user checking or unchecking the checkboxes.

for example the listener shown here:

 listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

 @Override
 public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

 Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();

 }

}

where do I put the listener code? and how do I set it up?

code for the ArrayAdapter:

  public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{
    CheckBoxInfo[] objects;
    Context context;
    int textViewResourceId;

    public MobileArrayAdapter(Context context, int textViewResourceId,
        CheckBoxInfo[] objects) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.textViewResourceId = textViewResourceId;
        this.objects = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row_layout_view = convertView;


            if ((row_layout_view == null)){


                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row_layout_view = inflater.inflate(R.layout.row_layout, null);
            }   

          //CheckBoxInfo item = objects.get(position);  // for arrayList
            CheckBoxInfo item = objects[position];

            if(item != null){

            TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1);
            CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1);

            if(item !=null){
            textView.setText(item.checkBoxName);
            checkBox.setChecked(item.checkBoxState);
               }
            }
            return row_layout_view;
    }


}

Solution

  • Do not use your example listView.setOnCheckedChangeListener or onCheckedChanged code.

    First of all, for CheckBox, you should use setOnClickListener() instead of setOnCheckedChangeListener(). You can get the checked state inside of the onClick() function.

    Second, place your setOnClickListener() inside of the getView() function of the list adapter.

    Example:

    checkBox.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            final boolean isChecked = checkBox.isChecked();
            // Do something here.
        }
    });