Android ListView中CheckBox选中状态失效:
在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快速简单。
有问题的代码
以前我在代码中是这样写的,实现的是CheckBox的OnCheckedChangeListener事件:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
...
viewHolder.checkBoxItemServerInfoSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public 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类型即可,修改后的代码为。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
...
viewHolder.checkBoxItemServerInfoSelected.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serverInfoList.get(position).setSelected(!serverInfoList.get(position).isSelected());
...
}
serverInfoList.get(position).setSelected(!serverInfoList.get(position).isSelected());
...
});
这样修改后,CheckBox的状态将跟随集合中数据的选中状态进行呈现,完美解决该问题。