ListView匹配数据混乱

今天一早回来上班,优化部分功能之后,发现了一个小问题,listview在适配数据的时候,有时正常,有时不正常。
功能需求:使用listview添加删除数据。
实现效果:第一次数据适配可正常增删数据,再次向listview添加数据,然后再删除,或许正常,或许不正常,之后数据添加完成,再去删除数据都会出现下标与选择数据的下标不一致。
分析原因:首先来看看一下我的适配器是怎么写的:

       if (null == convertView) {
            convertView = mInflate.inflate(R.layout.map_popup_item, null);
            holder = new PointHolder();
            holder.ibDelete = (ImageButton) convertView.findViewById(R.id.ib_Delete);
            holder.ibDelete.setOnClickListener(this);
            holder.tvPosition = (TextView) convertView.findViewById(R.id.tv_point_info);
            holder.tvPosition.setOnClickListener(this);
            holder.ibDelete.setTag(position);
            holder.tvPosition.setTag(position);
            convertView.setTag(holder);
        } else {
            holder = (PointHolder) convertView.getTag();
        }

看似没毛病,恩恩,我也觉得如此。理想总是美好的,显示总是那么骨感,经过一步步地调试,结果还是一样。。。。。。
首先:listview的已经适配数据,并且数据已经正常显示;
其次:每次点击listview总的某一项,部分数据总是与选择的数据不匹配;
再次:之后的数据适配都会有问题。
在下班时,向同事阐述所遇到的问题,真巧,同事以前正好遇到过类似的问题,并且成功解决了。
在listview做数据适配的时候,常常会选择去复用view,而且,想当然的会把点击事件和tag设置全写在复用的view里面,当listview去适配数据的时候,自然而然的选择了已经复用的view,由于view这个对象一直存在,并且没有得到释放,再次有数据前来和listview匹配的时候,未释放的对象引用便直接的被拿过来使用,包括之前为数据设置的tag,因此,在适配数据的时候可能会出现在不同页、相同位置的数据会有某些相同的处理。
解决方案:将数据设置全部移到view初始化之外去设置,例如我的修复问题的编码:

         if (null == convertView) {
            convertView = mInflate.inflate(R.layout.map_popup_item, null);
            holder = new PointHolder();
            holder.ibDelete = (ImageButton) convertView.findViewById(R.id.ib_Delete);
            holder.ibDelete.setOnClickListener(this);
            holder.tvPosition = (TextView) convertView.findViewById(R.id.tv_point_info);
            holder.tvPosition.setOnClickListener(this);
            convertView.setTag(holder);
        } else {
            holder = (PointHolder) convertView.getTag();
        }
        holder.ibDelete.setTag(position);
        holder.tvPosition.setTag(position);

这样问题就解决了。或许我的问题很低级,但是,我相信从事Android开发的同学们可能都遇到过,写这篇博客,希望处理listview的问题还迷茫的同学们有帮助。

如果喜欢,欢迎来顶。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值