在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。

更多相关文章

  1. [Android]单元测试实例
  2. android DrawerLayout 点击穿透、点击自身消失等问题解决
  3. 【高通SDM660平台 Android(安卓)10.0】(20) --- Actuator 与 Ker
  4. 菜鸟的安卓实习之路---- 如何实现android恢复出厂设置
  5. Android(安卓)Handler 分析
  6. android通过web service调用查询手机归属地代码
  7. android 悬浮球的实现,全部界面可用
  8. Android监听应用的安装、卸载、覆盖
  9. 【Android】报错IOException: Read-only file system问题解决方

随机推荐

  1. android 修改电脑盘符名称 USB连接电脑默
  2. Android中实现日期时间选择器(DatePicker
  3. Android(安卓)自绘输入框
  4. LinearLayout按下(pressed)或获取焦点(fo
  5. Android(安卓)TextView在XML中的属性
  6. Android之常用文件路径
  7. Android(安卓)Touch事件
  8. Android软件框架的搭建笔记
  9. 2010.11.16———android Camera 拍照的
  10. android下访问sd卡和网络的权限