商城购物车加减控件的简单封装(续),解决ListView中数据错乱的问题

本文针对ListView中购物车加减控件数据错乱的问题,介绍了问题产生的原因,并提供了两种解决方案。一种是利用数据集合中新增字段同步checkbox状态,另一种是通过接口传递数据和位置信息,确保正确赋值。最后,文章给出了库的使用方法和项目改版的说明。
摘要由CSDN通过智能技术生成

在上一篇文章中,我们学习了商城购物车加减控件的简单封装,知道了封装的思路过程和使用方法。还没有看过上一篇文章的朋友,建议先去阅读 商城购物车加减控件的简单封装 。这段时间收到一些小伙伴的反馈,在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的字段

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值