Android ListView中CheckBox选中状态失效:
在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快速简单。
有问题的代码
以前我在代码中是这样写的,实现的是CheckBox的OnCheckedChangeListener事件:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {...viewHolder.checkBoxItemServerInfoSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {serverInfoList.get(position).setSelected(!serverInfoList.get(position).isSelected());...}});viewHolder.checkBoxItemServerInfoSelected.setChecked(serverInfoList.get(position).isSelected());...return convertView;}
原因分析:
某一项划栋超出屏幕后,控件选中状态重置,自动触发OnCheckedChangeListener事件,且自动修改了数据集合中元素的选中状态(改为了"未选中"),导致出现业务逻辑错误。
我们要的是数据的选中与否的状态应该由用户控制,而不是控件本身。控件只起显示作用。
解决方案:
很简单,只需将CheckBox的事件由OnCheckedChangeListener类型改为控件通用的OnClickListener类型即可,修改后的代码为。
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {...viewHolder.checkBoxItemServerInfoSelected.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {serverInfoList.get(position).setSelected(!serverInfoList.get(position).isSelected());...}serverInfoList.get(position).setSelected(!serverInfoList.get(position).isSelected());...});
这样修改后,CheckBox的状态将跟随集合中数据的选中状态进行呈现,完美解决该问题。