android ListView添加checkbox注意事项
在andorid的ListView里面添加checkbox选项。在adapter的getview方法,我是这样写的。如下:
mItemView = null;if (convertView == null) {mItemView = new ItemView();LayoutInflater mInflater = LayoutInflater.from(mContext);convertView = mInflater.inflate(R.layout.list_item, null);mItemView.fileicon = (ImageView) convertView.findViewById(R.id.file_image);mItemView.fileName = (TextView) convertView.findViewById(R.id.file_name);mItemView.fileCount = (TextView) convertView.findViewById(R.id.file_count);mItemView.fileSize = (TextView) convertView.findViewById(R.id.file_size);mItemView.fileTime = (TextView) convertView.findViewById(R.id.file_time);mItemView.fileChcekbox = (CheckBox) convertView.findViewById(R.id.file_checkbox);//viewMap.put(position, mItemView);convertView.setTag(mItemView);} else {mItemView = (ItemView) convertView.getTag();}
这个写法比较普遍,这样,系统只在第一次的时候才进行初始化界面,其它情况都用缓存。
我们还需要一个数组来记录checkbox的点击情况。
public List<Integer> isSelected = new ArrayList<Integer>();
如果选中或者取消position的checkbox。
isSelected.add(new Integer(position));//选中isSelected.remove(new Integer(position));//取消
并且在getView里面,添加了checkbox的点击监听事件。代码如下:
mItemView.fileChcekbox.setOnClickListener(new OnClickListener(){ @Overridepublic void onClick(View v) {if(isSelected.contains(new Integer(position))){//取消 isSelected.remove(new Integer(position)); mItemView.fileChcekbox.setChecked(false); }else{ isSelected.add(new Integer(position));//选中 mItemView.fileChcekbox.setChecked(true); }} });
这代码看上去没错,我执行的时候也没报错,但是出现了不是我要的效果。就是我点击下面的checkbox,最新的checkbox跟着进行操作。如下图:
当我选中CustomLocale.apk的时候,第一项的checkbox也跟着选中了。我取消,它也取消。最后通过仔细遍历代码,发现问题就出在checkbox的监听事件。
因为,onClick里面的mItemView.fileChcekbox已经不是我们要点击的mItemView.fileChcekbox了,而是刷新后的,最新的position的mItemView.fileChcekbox。所以,当我们点击A时,往往B也选中了。因为mItemView.fileChcekbox是大家都复用的名称。以后遇到点击事件时候,要看看里面的变量是不是会随着某种情况,而改变。我将代码修改后如下:
final CheckBox checkbox = mItemView.fileChcekbox;mItemView.fileChcekbox.setOnClickListener(new OnClickListener(){ @Overridepublic void onClick(View v) {if(isSelected.contains(new Integer(position))){//取消 isSelected.remove(new Integer(position)); checkbox.setChecked(false);}else{ isSelected.add(new Integer(position));//选中 checkbox.setChecked(true);}} });
将mItemView.fileChcekbox赋值给变量checkbox。这个checkbox不会随列表刷新而改变,它就是A的checkbox。如果是原来的代码,A.setOnClickListener,当点击A时,此时的mItemView被赋予新的视图,不是A的mItemView,当我们点击A的时候,就调用A.setOnClickListener里面的代码,此时mItemView.fileChcekbox却成为B的checkbox了。所以,修改后,就不会出现这种情况。因为checkbox为final,并且就为A。
更多相关文章
- [Android]单元测试实例
- android DrawerLayout 点击穿透、点击自身消失等问题解决
- 【高通SDM660平台 Android(安卓)10.0】(20) --- Actuator 与 Ker
- 菜鸟的安卓实习之路---- 如何实现android恢复出厂设置
- Android(安卓)Handler 分析
- android通过web service调用查询手机归属地代码
- android 悬浮球的实现,全部界面可用
- Android监听应用的安装、卸载、覆盖
- 【Android】报错IOException: Read-only file system问题解决方