Android ListView滑动过程中图片显示重复错位闪烁问题解决.doc_第1页
Android ListView滑动过程中图片显示重复错位闪烁问题解决.doc_第2页
Android ListView滑动过程中图片显示重复错位闪烁问题解决.doc_第3页
Android ListView滑动过程中图片显示重复错位闪烁问题解决.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/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写法Java123456789101112131415161718192021222324Overridepublic View getView(int position, View convertView, ViewGroup parent) ViewHolder holder;if (convertView = null) convertView = inflater.inflate(R.layout.list_item, null);holder = new ViewHolder();convertView.setTag(holder); else holder = (ViewHolder)convertView.getTag();/* * ViewHolder * * author 2013-08-01 */private static class ViewHolder ImageViewappIcon;TextViewappName;TextViewappInfo;这样提升了性能,但同时也会造成另外一些问题: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中添加Java1234567891011121314151617181920Overridepublic View getView(int position, View convertView, ViewGroup parent) ViewHolder holder;if (convertView = null) convertView = inflater.inflate(R.layout.list_item, null);holder = new ViewHolder();convertView.setTag(holder); else holder = (ViewHolder)convertView.getTag();/ add tag for image, to compare it when image loaded finishimageView.setTag(imageUrl);/ if not in cache, restore defaultif (!Cache.ICON_CACHE.get(imageUrl, imageView) imageView.setImageDrawable(null);其中setTag表示设置标识,方便下面进行标志比对1if (!Cache.ICON_CACHE.get(imageUrl, imageView)Cache.ICON_CACHE为ImageCache的实例,表示如果不在缓存内则设置drawable为null(当然你可以可以设置为你自己的默认资源),防止显示了之前某个行item的图片,解决了a. 行item图片显示重复问题。在ImageCache的OnImageCallbackListener的onGetSuccess函数中添加Java1234567891011public void onGetSuccess(String imageUrl, DrawableimageDrawable, View view, booleanisInCache) / can be another view child, like textView and so onif (view != null &imageDrawable != null) ImageViewimageView = (ImageView)view;/ add tag judge, avoid listView cache and so onString imageUrlTag = (String)imageView.getTag();if (ObjectUtils.isEquals(imageUrlTag, imageUrl) imageView.setImageDrawable(imageDrawable);在上面用String imageUrlTag = (String)imageVi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论