我们分析原因:
1.我们知道ListView是一个复用的机制,每当我们将数据滑到第二页的时候,ConvertView就不为空了,我们知道ConvertView会缓存,
2.因为不管listView里显示多少条数据,都只是共用那么几个对象,然后我们的代码每一次把得到的对象重新赋值而已,
3.正是在这赋值的时候出了问题,假设android系统给我们生成了10个共用view对象,第一个view对象在第一屏的时候需要显示成"未选择"状态,而到了第二屏的时候,却要显示成"选择"状态,但由于是共用的同一个对象,根据第一点得知当checkBox的状态改变的时候,会调用onCheckedChange()方法。
4.也许有人会怀疑就算它调用了onCheckedChanged()方法,那又如何?onCheckedChange()方法里的代码还是将当前是否为选中状态保存到了list集合里,当我再次显示时还是会根据第二点里提到的代码来正确地显示,是的,代码会根据当前index来改变list集体的属性
5.是的我们找到真正的原因了就是因为index的值有问题。我们打印一下
由于图片插入有问题,我就不插入了,当我选择点击第一个0的时候,也打印了3,
我的解决方法是将选择的添加进一个集合进去,当然这不是最好的方法有人说,可以将初始化setOnCheckedChangeListener(),这个方法和这个状态的顺序交换一个就可以了,但是我试了一下还是不行,不知道是不是我的代码问题,最后我用了一下这个:将所有选择状态放入map集合里面去
HashMap<Integer,Booleam> state = new HashMap<>();
box.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
state.put(positon, isChecked);
} else {
state.remove(positon);
}
}});
最重要的还是这行代码:放在getView方法里面就可以了
box.setChecked(state.get(positon) == null ? false : true);