Search code examples
androidandroid-listfragmentcheckboxlist

ListFragment Checkbox is checked automatically


I have a ListFragment which populates lists with checkbox. Whenever i click on few checkbox some other checkbox is also getting selected automatically on same list.

public class ListViewDemoAdapter extends ArrayAdapter<ListViewItem> {


public ListViewDemoAdapter(Context context, List<ListViewItem> items) {
    super(context, R.layout.mytrip_item, items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;

    if(convertView == null) {
        // inflate the GridView item layout
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.mytrip_item, parent, false);

        // initialize the view holder
        viewHolder = new ViewHolder();
        viewHolder.ivIcon                   = (ImageView) convertView.findViewById(R.id.ivIcon);
        viewHolder.tvTitle                  = (TextView) convertView.findViewById(R.id.tvTitle);
        viewHolder.tvDescription            = (TextView) convertView.findViewById(R.id.tvDescription);
        viewHolder.ratingBar                = (RatingBar) convertView.findViewById(R.id.ratingBar);

    // update the item view
    ListViewItem item = getItem(position);
    Glide.with(getContext())
    .load(NetworkIp.IMAGE_URL+item.pic_url)
    .into(viewHolder.ivIcon);

    viewHolder.tvTitle.setText(item.placename);
    viewHolder.tvDescription.setText(item.placedesc);
    viewHolder.ratingBar.setRating(item.placerate);
    return convertView;}
private static class ViewHolder {
    ImageView ivIcon;
    TextView tvTitle;
    TextView tvDescription;
    TextView tvDateTime;
    CheckBox chkBox;
    RatingBar ratingBar;
}

}


Solution

  • You have to maintain a seperate hashMap for your check boxes to see whether they are selected or not because list view recycles its views.You can do like this:-

    public class ListViewDemoAdapter extends ArrayAdapter<ListViewItem> {
        public HashMap<Integer,Boolean> chk;
        public ListViewDemoAdapter(Context context, List<ListViewItem> items) {
            super(context, R.layout.mytrip_item, items);
            chk = new HashMap<>();
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
    
            if(convertView == null) {
                // inflate the GridView item layout
                LayoutInflater inflater = LayoutInflater.from(getContext());
                convertView = inflater.inflate(R.layout.mytrip_item, parent, false);
    
                // initialize the view holder
                viewHolder = new ViewHolder();
                viewHolder.ivIcon                   = (ImageView) convertView.findViewById(R.id.ivIcon);
                viewHolder.tvTitle                  = (TextView) convertView.findViewById(R.id.tvTitle);
                viewHolder.tvDescription            = (TextView) convertView.findViewById(R.id.tvDescription);
                viewHolder.ratingBar                = (RatingBar) convertView.findViewById(R.id.ratingBar);
    
                viewHolder.chkBox                   = (CheckBox) convertView.findViewById(R.id.chk);  ///  Your checkbox ID
                convertView.setTag(viewHolder); // setTag
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            // update the item view
            ListViewItem item = getItem(position);
            Glide.with(getContext())
                    .load(NetworkIp.IMAGE_URL+item.pic_url)
                    .into(viewHolder.ivIcon);
    
            viewHolder.tvTitle.setText(item.placename);
            viewHolder.tvDescription.setText(item.placedesc);
            viewHolder.ratingBar.setRating(item.placerate);
            viewHolder.chkBox.setTag(position);
            if(chk.containsKey(position)) {
                viewHolder.chkBox.setChecked(chk.get(position));
            }else{
                viewHolder.chkBox.setChecked(false);
                chk.put(position, false);
            }
            viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    chk.put((Integer) buttonView.getTag(), isChecked);
                }
            });
            return convertView;
        }
        private static class ViewHolder {
            ImageView ivIcon;
            TextView tvTitle;
            TextView tvDescription;
            TextView tvDateTime;
            CheckBox chkBox;
            RatingBar ratingBar;
        }
    }