在上一篇文章中,我们学习了商城购物车加减控件的简单封装,知道了封装的思路过程和使用方法。还没有看过上一篇文章的朋友,建议先去阅读 商城购物车加减控件的简单封装 。这段时间收到一些小伙伴的反馈,在ListView或者是RecyclerView中存在item复用导致数据错乱的问题,这篇文章就重点解决item复用导致数据错乱的问题和在ListView或者RecyclerView中的用法。下面为了方便我们以ListView为例(RecyclerView是一样的)。
1. 先看下效果图
效果图:
Github地址:https://github.com/Jmengfei/AddSubUtils
2. 为什么复用会导致数据错乱?
有过开发经验的人都知道ListView的缓存复用机制虽然提升了它的性能,但是同样也带来了其他问题,复用item导致数据错乱就是其中一个。在这里我们不讨论为什么会这样。因为如果展开说这个问题的话就失去了本文章的重点。这里主要说下解决方法的思路。
3. 解决思路
解决这个问题的思路很多,网上一般给出这两种办法
上来就说是因为convertview对象共用的原因,不能用convetView,而是每次getView()的时候都new一个对象的view出来.这种办法大概是用屁股想出来的.
即然错乱,那我就自己再弄一个集合保存checkBox的状态,再错乱,弄死你.即然adapter里有一个list集合里保存checkBox的状态了,为什么还要自己再保存一次checkBox的状态呢,不是多此一举吗?
这里我们先看一个例子
这是再正常不过的例子了,item布局非常简单。点击item条目改变CheckBox的选中状态。看下adapter中getView()的代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if(convertView == null) {
convertView = View.inflate(mContext, R.layout.lv_item,null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvItem.setText(datas.get(position));
// 点击事件
holder.rlItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.cbItem.setChecked(!holder.cbItem.isChecked());
}
});
return convertView;
}
现在咱们修改datas数据bean的数据,增加一个控制checkbox的字段