ListView中使用CheckBox
ListView出于内存优化的考虑,android为我们提供了convertView。可是复用item,会使CheckBox的选中状态错乱。下面为大家讲解一下,我是怎样处理的。
这次我接到的需求是如图所示:
并且,下次进入要把选中的状态携带进来。
我最先想到的处理办法是ListView与CheckBox结合,但是这样做的话便会出现,如下两个问题:
1.当我ListView上下滑动的时候,选中状态会错乱;
2.当我携带一组选中状态进入到ListView的时候,状态没有绘制成功。
其实这两个问题,可以归结为一个,就是ListView复用导致的.
有一些博客可能会教大家在adapter中写一个Map,保存每个条目的选中与未选中的状态,但是我亲测过程中出现一些问题,由于时间久远我记不清是上述两点中的哪个未被解决了。现提供一个比较简单的办法来处理ListView与CheckBox之间的冲突。
当屏幕中只能展示ListView的10个item,当第11个item滑出是,它复用的是第1个item,但是由于setChecked()方法会触发监听器,而此时,第11个的item触发的是第1个item的中CheckBox的监听器,这也就导致了,第1个item中的CheckBox执行了onCheckedChanged(),所以也就出现了错乱的问题。但是如果先设置监听又会让CheckBox多出许多选中状态,同样会出现错乱。
现在我们已经知道是监听器的原因了,所以我们可以在setChecked()之前先清空监听,防止干扰setChecked()对CheckBox的状态进行设置。我们只需在setChecked()之前加上一句
holder.cb.setOnCheckedChangeListener(null)
这样就可以了。
下面贴上我自己的代码(需求,选中状态是由外部传入,然后在ListView中做展示,并可修改各个item的选中状态)
Adapter怎样给Activity提供接口
由于上面提到adapter和activity互传数据的问题,以下为怎样给activity提供接口,供activity回调adapter中数据,不想把activity和adapter写在一个activity中的童鞋可以借鉴一下:
|
|
如需转载,请注明出处:YauLam’s Blog,thank u~