0

When I scroll the listview, my selected checkbox's are interchanged

My adapter class:

public class AdapterInvitePartner extends ArrayAdapter<FindPartnerPojo> {
    private LayoutInflater inflater;
    private List<FindPartnerPojo> objectList;
    private List<String> checkboxCheckedList= new ArrayList<String>();
    int i = 0;

    public AdapterInvitePartner(Context context, int textViewResourceId,
            List<FindPartnerPojo> objects) {
        super(context, R.layout.items_find_partners, objects);
        this.objectList = objects;
        this.inflater = LayoutInflater.from(context);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
         FindPartnerPojo item = objectList.get(position);
         final String id=item.getUserid();
        if (convertView == null) {

            convertView = inflater.inflate(R.layout.items_find_partners, null);

            holder = new ViewHolder();

            holder.partner_email_addr_textview = (TextView) convertView
                    .findViewById(R.id.textView_partner_email_addr);
            holder.partner_phone_number_textview = (TextView) convertView
                    .findViewById(R.id.textView_partner_phone_number);
            holder.checkbox = (CheckBox) convertView
                    .findViewById(R.id.partner_checkBox);

            holder.checkbox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            if (isChecked) {
                                checkboxCheckedList.add(id);
                            } else {
                                checkboxCheckedList.remove(id);
                            }

                        }

                    });

            convertView.setTag(holder);
            i++;
        }
        // if it's exist convertView then consume it
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.partner_email_addr_textview.setText(item.getEmail());
        holder.partner_phone_number_textview.setText(item.getPhone_number());

        return convertView;

    }

    static class ViewHolder {
        TextView partner_email_addr_textview, partner_phone_number_textview;
        CheckBox checkbox;
    }

    public List<String> getCheckBoxList() {
        return checkboxCheckedList;
    }

}

Set Adapter:

adapter = new AdapterInvitePartner(getApplicationContext(),
                R.layout.items_find_partners, Constant.findpartnerlList);
        partner_listview.setAdapter(adapter);
        partner_listview.setCacheColorHint(0);
mmBs
  • 8,421
  • 6
  • 38
  • 46
chimbu
  • 786
  • 5
  • 16
  • 36
  • Take a look at this link: https://stackoverflow.com/questions/23214189/checkbox-looses-state-on-listview-scrolling?rq=1 – Ayush Kumar May 09 '14 at 14:13

3 Answers3

0

You have to reset the value of the checkbox manually as the convertView is recycled.

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
         FindPartnerPojo item = objectList.get(position);
         final String id=item.getUserid();
        if (convertView == null) {

        convertView = inflater.inflate(R.layout.items_find_partners, null);

        holder = new ViewHolder();

        holder.partner_email_addr_textview = (TextView) convertView
                .findViewById(R.id.textView_partner_email_addr);
        holder.partner_phone_number_textview = (TextView) convertView
                .findViewById(R.id.textView_partner_phone_number);
        holder.checkbox = (CheckBox) convertView
                .findViewById(R.id.partner_checkBox);
        convertView.setTag(holder);
        i++;
    }
    // if it's exist convertView then consume it
    else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.partner_email_addr_textview.setText(item.getEmail());
    holder.partner_phone_number_textview.setText(item.getPhone_number());
        **holder.checkbox
                .setOnCheckedChangeListener(null);
        holder.checkbox.setChecked(the_original_value);**
        holder.checkbox
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        if (isChecked) {
                            checkboxCheckedList.add(id);
                        } else {
                            checkboxCheckedList.remove(id);
                        }

                    }

                });


    return convertView;

}
Hardik4560
  • 3,202
  • 1
  • 20
  • 31
0

Due to view recycling, you have to set all properties that can change explicitly in the getView. In particular, the checked state:

holder.checkbox.setChecked(checkboxCheckedList.contains(id));

Will check the checkbox if it has been checked before.

njzk2
  • 38,969
  • 7
  • 69
  • 107
0
@Override

public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}

Add this two methods to your Adapter. from here

https://stackoverflow.com/a/13643704/2042347

Community
  • 1
  • 1
Chidhambaram
  • 118
  • 7
  • this is terrible. you are basically telling the adapter to never recycle any view, but to always create a new one ! (also, it would probably still recycle the views for the view at the same index, probably ending up effectively duplicating images.) – njzk2 May 09 '14 at 20:49
  • the point I don't get is that the question you link to contains a valid and proper (and accepted as such) answer above the one you quote. – njzk2 May 09 '14 at 20:52