Checking a checkbox in listview makes other random checkboxes checked too

后端 未结 3 1319
耶瑟儿~
耶瑟儿~ 2020-11-28 09:14

whenever i check a checkbox in my listview , other random checkboxes get checked too . It could be due to item recycling by listview.

I also tried setting android:f

3条回答
  •  清酒与你
    2020-11-28 10:03

    A combination of these two approaches worked for me:

    I have a boolean array on class level which I use to keep track of the value of checkboxes.

    boolean [] checkedItems = new boolean[listItems.size()];
    

    In getView() :

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
    
            if (convertView == null) {
    
                convertView = inflater.inflate(R.layout.menu_item_list_item,
                        parent, false);
    
                holder = new ViewHolder();
    
                holder.name = (TextView) convertView
                        .findViewById(R.id.menuItemLargeName);
                holder.mainItemCheckBox = (CheckBox) convertView
                        .findViewById(R.id.menuItemLargeCheckBox);
    
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
                // remove the listener so that it does not get attached to other chechboxes. 
                holder.mainItemCheckBox.setOnCheckedChangeListener(null);
                //update the checkbox value from boolean array
                holder.mainItemCheckBox.setChecked(checkedItems[position]);
            }
    
    
            holder.name.setText(listItems.get(position).getName());
    
            holder.mainItemCheckBox
                    .setOnCheckedChangeListener(onCheckedListener);
            holder.mainItemCheckBox
                    .setTag(R.id.menuItemLargeCheckBox, position);
    
            return (convertView);
        }
    

    In my OnCheckedChangeListener() : update the boolean array.

        OnCheckedChangeListener onCheckedListener = new OnCheckedChangeListener() {
    
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
    
            int position = (Integer) buttonView
                    .getTag(R.id.menuItemLargeCheckBox);
    
            MenuItemObject menuItem = listItems.get(position);
    
            if (isChecked) {
    
                cartItems.add(menuItem);
                checkedItems[position] = true;
    
            } else {
    
                cartItems.remove(menuItem);
                checkedItems[position] = false;
            }
    
    
        }
    };
    

提交回复
热议问题