`
lynen
  • 浏览: 125147 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

ListView的adapter中的getView函数多次重复调用,导致数据显示重复的问题分析

 
阅读更多

使用ListView显示数据,其中单个item的xml文件中存在ImageView,且此ImageView的图像内容是从网络上下载下来的。实现的时候,为提供ListView的显示性能,因此在adapter的getView中复用了convertView对象。

功能实现后,测试过程中发现如下问题:

在listview显示的数据项存在翻页的情况下,有的时候滚动完成会出现图片显示错乱或者是相邻两个item的图片显示的是同一张的问题。

 

问题排查的思路:

1.最开始定位的是ImageView在加载网络图片的时候,有可能会在图片显示对象convertView中的ImageView对象出现线程时序的问题导致的重复。反复验证发现,问题并非出自网络图片的加载机制。此疑点放过。

 

2.使用比较吐的方法,将getView中的position的值打印出来,查看打印的结果发现:

即使未显示adapter中的第0个元素的情况下,也会出现有大量的日志是第0个元素调用getView的情况。

未解决重复的问题,首先要排除掉第0个元素调用了多次getView的情况。

自行定义了一下问题,一时查看代码也发现不了问题原因在哪里,谷歌一把发现:此文章有提到getView被多次调用的情况:http://my.eoe.cn/fover23/archive/4885.html

 

按照此文章的问题解决思路,将listview中的在layout文件中的layout_height="wrap_content",修改成 layout_height="match_parent"或者是"fill_parent",解决了第0个元素多次调用getView的问题。

在解决此问题的基础上在测试图片显示重复的问题:发现图片显示重复的问题也没有了。

 

回滚代码,再次验证重复图片本应该显示的位置,发现出现重复图片的情况是因为应该显示a,b项的图片结果确显示了第0项的图片。

 

问题启示:android在绘制view的过程中的长宽衡量方法与过程应该要更精确的掌握。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics