欢迎来到天天文库
浏览记录
ID:6722830
大小:65.50 KB
页数:4页
时间:2018-01-23
《android listview滑动过程中图片显示重复错位闪烁问题解决》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、http://www.mobiletrain.org/AndroidListView滑动过程中图片显示重复错位闪烁问题解决主要分析AndroidListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓存机制。1、原因分析ListViewitem缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过adapter的getView函数获得每行的item。滑动过程中,a.如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存;b.获取滑入屏幕的行item之前会先判断缓存中是
2、否有可用的item,如果有,做为convertView参数传递给adapter的getView。更具体可见源代码ListView.obtainView。 这样,如下的getView写法就可以充分利用缓存大大提升ListView的性能。即便上万个行item,最多inflate的次数为n,n为一屏最多显示ListView行item的个数。ListViewAdaptergetView写法Java12345678910111213141516@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){View
3、Holderholder;if(convertView==null){convertView=inflater.inflate(R.layout.list_item,null);holder=newViewHolder();……convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}} /***ViewHolder*北京千锋互联科技有限公司版权所有http://www.mobiletrain.org/1718192021222324*@authortrinea@trinea.cn2013-08
4、-01*/privatestaticclassViewHolder{ ImageViewappIcon;TextView appName;TextView appInfo;}这样提升了性能,但同时也会造成另外一些问题:a.行item图片显示重复这个显示重复是指当前行item显示了之前某行item的图片。比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,且滑动过程中该图片加载结束,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显
5、示重复。 b.行item图片显示错乱这个显示错乱是指某行item显示了不属于该行item的图片。比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱。 c.行item图片显示闪烁上面b的情况,第14行图片又很快加载结束,所以我们看到第14行先显示了第2行的图片,立马又显示了自己的图片进行覆盖造成闪烁错乱。 2、解决方法通过上面的分析我们知道了出现错乱的原因是异步
6、加载及对象被复用造成的,如果每次getView能给对象一个标识,在异步加载完成时比较标识与当前行item的标识是否一致,一致则显示,否则不做处理即可。下面以使用ImageCache为ListView提供图片获取缓存为例,ListView中强烈推荐使用北京千锋互联科技有限公司版权所有http://www.mobiletrain.org/ImageCache。首先在listviewadapter的getView中添加Java1234567891011121314151617181920@OverridepublicViewgetView(intposition,ViewconvertVi
7、ew,ViewGroupparent){ViewHolderholder;if(convertView==null){convertView=inflater.inflate(R.layout.list_item,null);holder=newViewHolder();……convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();} ……//addtagforimag
此文档下载收益归作者所有