ListView复用混淆问题很常见, 安卓手机的文件管理或者电话本都有批量管理这一项, checkBox的复用混淆很经典, 关于复用的机制我就不在这里一一赘述了, OK, 开始写代码
首先在ListView的适配器中定义一个map, 用来存储checkBox的状态
//定义map存储状态
private Map<Integer, Boolean> isChecked;
将其初始化的时候讲所有checkBox的状态设置为false(未选中)
//初始化
isChecked = new HashMap<>();
//根据整个datas.sizes设置整个map为false
for (int i = 0; i < datas.size(); i++) {
isChecked.put(i, false);
}
然后设置checkBox的点击事件, 点击哪个checkBox, 就将其状态修改为true
//点击哪个checkBox, 就将其对应的设置为true
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isChecked.get(position)){
isChecked.put(position, false);
} else if (!isChecked.get(position)){
isChecked.put(position, true);
notifyDataSetChanged();
}
}
});
在点击过程中, 首先获取当前position的状态, 如果为true就修改为false, 如果为false就修改为true
现在map里面存储的是最新的checkBox的状态, 根据记录的状态重新设置checkbox的显示状态
//根据记录的状态重新设置checkBox的状态
if (isChecked.get(position)){
holder.checkBox.setChecked(true);
} else if (!isChecked.get(position)){
holder.checkBox.setChecked(false);
}
在滑动的过程中, 每个checkbox会根据map存储的状态重新设置checkbox的状态, 从而达到了解决ListView复用的问题
现在贴出完整ListView适配器
public class MyAdapter extends BaseAdapter {
private Context context;
private List<String> datas;
private ViewHolder holder;
//定义map存储状态
private Map<Integer, Boolean> isChecked;
public MyAdapter(Context context) {
this.context = context;
}
public void setDatas(List<String> datas) {
this.datas = datas;
//初始化
isChecked = new HashMap<>();
//根据整个datas.sizes设置整个map为false
for (int i = 0; i < datas.size(); i++) {
isChecked.put(i, false);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return datas != null && datas.size() > 0 ? datas.size() : 0;
}
@Override
public Object getItem(int position) {
return datas != null && datas.size() > 0 ? datas.size() : null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_list, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(datas.get(position));
//点击哪个checkBox, 就将其对应的设置为true
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isChecked.get(position)){
isChecked.put(position, false);
} else if (!isChecked.get(position)){
isChecked.put(position, true);
notifyDataSetChanged();
}
}
});
//根据记录的状态重新设置checkBox的状态
if (isChecked.get(position)){
holder.checkBox.setChecked(true);
} else if (!isChecked.get(position)){
holder.checkBox.setChecked(false);
}
return convertView;
}
class ViewHolder{
CheckBox checkBox;
TextView tv;
public ViewHolder(View view) {
checkBox = (CheckBox) view.findViewById(R.id.item_check_box);
tv = (TextView) view.findViewById(R.id.item_tv);
}
}
}
如果是TextView和button的混淆, 解决方法和checkbox都是一样的, 不足之处希望大家多多指教, 顶一下
, 多谢!!!