今天实现在ListView中实现多选并一次性结束被选中的进程时遇到了一个问题,在网上找也找不到对该类问题的解决办法,所以就贴出来讨论讨论:
当我选中了第一个item的CheckBox时,显示只选中了一个:
注意:当我向下滑动的时候,没有选中的进程也自动被选中:
之后我跟踪了一下程序的运行,但是程序也没有问题。
不过又试了几次我注意到,每次的我在正在显示的界面的程序列表中选中一个cb,被自动选中的都不会在同一个正在显示的列表中。
那么问题出来了,然而答案也随之出来了:
-----------问题就在于convertView。
原因:
我们都知道,ListView的convertView是用来对item控件进行缓存的,那么当我选中了第一个cb的时候,当我上划之后,之前选中的cb也就会被
缓存到convertView中,而这时缓存中的cb是选中状态,所以显示出来就是选中的状态。
解决办法:
这个问题的解决办法其实主要针对缓存convertView即可:
1|首先保存多选的item的id(或者包名等等,只要可以识别对应的进程即可,对于要结束进程的,包名比较合适,因为在结束进程时需要区分进程对应应用的包名);
2|在Adapter中getView方法中对缓存中的内容进行判断(通过保存的id或者包名)
------------------下面是我的解决代码片段
if (chosed_pkgs_list.get(position) != null) {
vh.unstall_tag.setChecked(true);
} else {
vh.unstall_tag.setChecked(false);
}
变量类型注释:
private SparseArray<String> chosed_pkgs_list;//选中的软件对象
ViewHolder vh = new ViewHolder();//ViewHolder优化类
CheckBox unstall_tag; //CheckBox标识
在getView方法中根据保存的
不过:
这样做的额弊端也很多,比如在滑动的时候进行判断后,程序运行效率会降低等,我在这里只说一种解决办法,算是比较通用的办法吧!
如果您还有更好的解决方案,欢迎在这里讨论...