ListView匹配数据混乱

时间:2022-04-10 09:14:20

今天一早回来上班,优化部分功能之后,发现了一个小问题,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的问题还迷茫的同学们有帮助。

如果喜欢,欢迎来顶。