Listview containing checkbox and text is getting reset on scrolling

倖福魔咒の 提交于 2019-11-29 18:16:15

It because of recycling use of views in ListView. You should create some HashMap:

HashMap<Integer, Boolean> checked;

Then in your constructor do this:

checked = new HashMap<Integer, Boolean>(getCount());

After set OnCheckedChangeListener on your checkboxes, and in event method do this:

checked.put(position, yourCheckBoxCheckedState);

And in getView() method do this:

Boolean isChecked = checked.get(position);
checkBox.setChecked(isChecked == null ? false : isChecked)

Try this, I think it should help

UPDATE

resetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.deselectAll();
            }
        });

Then in adapter create method:

 public void deselectAll() {
   checked = new HashMap<Integer, Boolean>(getCount());
   notifyDataSetChanged();
 }

In your FilterDrawerItem class, make a boolean variable isChecked.

Now in your adapter class, write something like this:

if(dItem.isChecked){
    drawerHolder.checkBox.setChecked(true);
}
else{
    drawerHolder.checkBox.setChecked(false);
}

and in your OnCheckedChangeListener:

if (isChecked) {
    //your other code
    dItem.setChecked(true);
    notifyDataSetChanged();
} else {
    //your other code
    dItem.setChecked(false);
    notifyDataSetChanged();
}

@Orest Savchak's answer is also right, but keeping track of checkboxes in your POJO classes will help you to retrieve the checked items later and also do other things easier, like you want to uncheck all the checkboxes on click of "Reset" button. For that, in onClick() on reset button, you'll just need to do:

for(int i=0; i<FilterDrawerItem.size; i++){
    FilterDrawerItem.get(i).setChecked(false);
}
adapterObject.notifyDataSetChanged();

EDIT 1:

Create getter setter for drawerItemList in your adapter and then in onClick() of reset button, in place of dataList, do as following:

List<FilterDrawerItem> adapterDataList=adapter.getDataList();
for(int i=0; i<adapterDataList.size(); i++){
    adapterDataList.get(i).setCheckBoxId(false);
}
adapter.setDataList(adapterDataList);
adapter.notifyDataSetChanged();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!