Android 中使用ListView和CheckBox进行批量操作
2016-01-09 10:15
351 查看
在使用ListView时,一般为了性能的提升,都会使用ViewHolder,也就是Item的View实现复用。
现在的问题是,当在ListView的Item中包含CheckBox,并且CheckBox的事件处理监听器是holder.checkbox.setOnCheckedChangeListener()时,会出现第一项开始未选中,当第二项选中时第一项也跟着选中,这显然不是我们想要的结果。
出现这个问题的原因是第一项和第二项用的是同一个Item,当第二项选中时,CheckBox的当前状态为选中,这时setOnCheckedChangeListener里面会改变第一项关联的实体对象的属性(引用类型,变量A、B都引用同一个对象AA,当A把AA的某个属性值修改了,B再次访问时,AA对象的那个属性的值为A引用改后的值),代码如下:
?
解决办法:
1、在ListViewAdapter初始化时,将对象中有关CheckBox是否选中的属性存储起来。
?
2、去掉CheckBox的holder.checkbox.setOnCheckedChangeListener(){}事件监听器
3、在Adapter里的 public View getView(final int position, View convertView, ViewGroup parent){}方法体里面,当前的CheckBox是否选中状态,由之前初始化时保存的对象属性值控制,代码如下:
?
3、用户点击ListView的Item时,改变CheckBox的状态,代码如下:
?
数据适配器ListViewAdapter的完整代码:
?
Activity中onCreate()里的写法:
?
SearchToolbar类的代码:
?
top_search_toolbar.xml文件:
?
现在的问题是,当在ListView的Item中包含CheckBox,并且CheckBox的事件处理监听器是holder.checkbox.setOnCheckedChangeListener()时,会出现第一项开始未选中,当第二项选中时第一项也跟着选中,这显然不是我们想要的结果。
出现这个问题的原因是第一项和第二项用的是同一个Item,当第二项选中时,CheckBox的当前状态为选中,这时setOnCheckedChangeListener里面会改变第一项关联的实体对象的属性(引用类型,变量A、B都引用同一个对象AA,当A把AA的某个属性值修改了,B再次访问时,AA对象的那个属性的值为A引用改后的值),代码如下:
?
1、在ListViewAdapter初始化时,将对象中有关CheckBox是否选中的属性存储起来。
?
3、在Adapter里的 public View getView(final int position, View convertView, ViewGroup parent){}方法体里面,当前的CheckBox是否选中状态,由之前初始化时保存的对象属性值控制,代码如下:
?
?
?
?
?
?
相关文章推荐
- Android Volley 框架的使用
- Android Volley框架使用详解
- Android常见工具类封装
- Android 常用的adb命令
- Android应用权限管理总结
- 浅析Android中的消息机制
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android之线性布局
- android数据存储
- Android控件之RadioGroup和RadioButton
- Ubuntu 14.04 64位编译Android4.2.2源代码
- Android中的MVP
- Android使用criteria选择合适的地理位置服务实现方法
- Android实现自定义带文字和图片的Button
- Android Calendar的应用
- Android中特殊图形的生成样例
- Android控件之CheckBox
- Android编程中@id和@+id的区别分析
- Android控件之ToggleButton
- android基本控件ToggleButton&Switch使用指南