博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享磨砺营威哥讲解-Android ListView滑动过程中图片显示重复错位闪烁问题解决...
阅读量:7207 次
发布时间:2019-06-29

本文共 1648 字,大约阅读时间需要 5 分钟。

hot3.png

Android ListView

本文主要分析Android ListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓存机制。  1、原因分析  ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过adapter的getView函数获得每行的item。滑动过程中,

a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存; b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,如果有,做为convertView参数传递给adapter的getView。更具体可见源代码ListView.obtainView。 这样,如下的getView写法就可以充分利用缓存大大提升ListView的性能。即便上万个行item,最多inflate的次数为n,n为一屏最多显示ListView 行item的个数。 ListView Adapter getView写法 这样提升了性能,但同时也会造成另外一些问题: a. 行item图片显示重复 这个显示重复是指当前行item显示了之前某行item的图片。 比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,且滑动过程中该图片加载结束,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显示重复。 b. 行item图片显示错乱 这个显示错乱是指某行item显示了不属于该行item的图片。 比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱。 c. 行item图片显示闪烁 上面b的情况,第14行图片又很快加载结束,所以我们看到第14行先显示了第2行的图片,立马又显示了自己的图片进行覆盖造成闪烁错乱。 2、解决方法 通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次getView能给对象一个标识,在异步加载完成时比较标识与当前行item的标识是否一致,一致则显示,否则不做处理即可。 下面以使用ImageCache为ListView提供图片获取缓存为例,ListView中强烈推荐使用ImageCache。 首先在listview adapter的getView中添加 其中setTag表示设置标识,方便下面进行标志比对 Cache.ICON_CACHE为ImageCache的实例,表示如果不在缓存内则设置drawable为null(当然你可以可以设置为你自己的默认资源),防止显示了之前某个行item的图片,解决了a. 行item图片显示重复问题。 在ImageCache的OnImageCallbackListener的onGetSuccess函数中添加 在上面用String imageUrlTag = (String)imageView.getTag();取得之前设置的tag,然后和当前的url进行比较,如果相等则显示,解决了b. 行item图片显示错乱,c.

本文出自微信公众号mjw-java,更多内容关注微信公众号或访问[www.moliying.com](http://www.moliying.com)  此外腾讯课堂Android项目实战公开课马上就要结课啦,纯干货,感兴趣的朋友记得报名去听啊。地址:https://ke.qq.com/course/144222#term_id=100163320

转载于:https://my.oschina.net/moliying/blog/727748

你可能感兴趣的文章
The Cow-Signal
查看>>
centOS7 初始环境配置
查看>>
HTML5 Canvas绘制跟随鼠标移动的球
查看>>
leetcode1048
查看>>
Log Analysis - DataFrame
查看>>
Spring Data Solr
查看>>
页面渲染的同步和异步区别?
查看>>
MongoDB基本使用
查看>>
[转]Eclipse中远程调试Hadoop
查看>>
由一个C语言递归判断回文数的程序产生的回忆
查看>>
Linux下安装mysql5.7
查看>>
1.1.3 Getting Started_Budding Your First App_Building a Simple User Interface
查看>>
学习日记0907 GIL全局解释器锁 死锁与递归锁 信号量 Event事件 线程的queue
查看>>
linux awk函数
查看>>
性能测试
查看>>
阿里云服务器Linux CentOS安装配置(六)resin多端口配置、安装、部署
查看>>
jQuery对象与DOM对象之间的转换(转)
查看>>
asp.net跳转页面的三种方法比较
查看>>
Bzoj1076 [SCOI2008]奖励关
查看>>
JCo 指南
查看>>