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
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;
}
}
};