**解决ListView中CheckBox状态混乱**
先来看看CheckBox选中状态混乱现象
在这里明明只选中了前3个,但在滑动的时候其他item中的某些CheckBox也被选中了!
这里会出现这个问题的主要原因是使用了ViewHolder ,我们把ViewHolder 绑定在了convertView中,自然也把CheckBox的选中状态也记录在了convertView。导致了滑动时调用getView(),返回return convertView;使后面出现的的某些CheckBox也处于选中状态。
解决办法:
一:根据数据源个数 定义一个TreeMap集合,用于存放每个item中CheckBox状态
Map<Integer, Boolean> integerBooleanMap=new TreeMap<>();
二:初始化每个item中CheckBox状态(我这里默认全部为未选中状态)
for (int i = 0; i < allmusicDatas.size() - 1; i++) {
integerBooleanMap.put(i,false);
}
三:对每个item中的CheckBox进行监听(这里可根据position,记录对应CheckBox的状态)
myViewhouder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
integerBooleanMap.put(position,true);
} else
integerBooleanMap.put(position,false);
}
});
四:设置当前CheckBox状态
myViewhouder.cb.setChecked(integerBooleanMap.get(position));
return convertView;
五 :MyAdpter完整代码
public class MyAdpter extends BaseAdapter {
@Override
public int getCount() {
return ArtistmusicArrayList.size();
}
@Override
public Object getItem(int position) {
return ArtistmusicArrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
MyViewhouder myViewhouder;
if (convertView == null) {
convertView = LayoutInflater.from(Activity_lisview_music.this).inflate(R.layout.music_item, null);
myViewhouder = new MyViewhouder(convertView);
convertView.setTag(myViewhouder);//绑定
} else
myViewhouder = (MyViewhouder) convertView.getTag();
myViewhouder.cb.setVisibility(ISVISIBLE);
//对每个item中的CheckBox进行监听
myViewhouder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
integerBooleanMap.put(position,true);
} else
integerBooleanMap.put(position,false);
}
});
myViewhouder.cb.setChecked(integerBooleanMap.get(position));
return convertView;
}
class MyViewhouder {
TextView tv_music_title, tv_music_, tv_music_duration, tv_music_size;
CheckBox cb;
public MyViewhouder(View v) {
this.tv_music_title = (TextView) v.findViewById(R.id.tv_music_title);
this.tv_music_ = (TextView) v.findViewById(R.id.tv_music_);
tv_music_duration = (TextView) v.findViewById(R.id.tv_music_duration);
tv_music_size = (TextView) v.findViewById(R.id.tv_music_size);
cb = (CheckBox) v.findViewById(R.id.cb);
}
}
}
六:CheckBox滑动正常,不再错乱