在android中使用Adapter,局限与android内部机制的原因,listview在加载大量的图片的过程中,如果不使用ViewHolder复用的方式,会导致程序产生OOM的问题。

以下是一般情况下,ViewHolder复用的用法

 

 1 @Override 2     public View getView(int position, View convertView, ViewGroup parent) { 3         ViewHolder holder = null; 4         if (convertView == null) { 5             holder = new ViewHolder(); 6             convertView = inflater.inflate(R.layout.item_gv_picture, null); 7             holder.iv_Picture = (ImageView) convertView 8                     .findViewById(R.id.iv_Picture); 9             convertView.setTag(holder);10         }11         holder = (ViewHolder) convertView.getTag();12         ImageLoader.getInstance().displayImage(13                   bitmapEntities.get(position).getBmp(),holder.iv_Picture);14         holder.iv_Picture.setScaleType(ScaleType.FIT_XY);15         return convertView;16     }17 18 /*控件缓存类*/19     class ViewHolder {20         ImageView iv_Picture;21     }        

 

 

 

但是在使用这种方式的情况下,我们会遇到另外一个问题:listview的快速滚动,会导致图片闪烁替换。

这样的效果十分难看,导致用户的体验非常差,因此开启在网上搜索解决方案之旅,查了很多都没有头绪。突然灵光一闪,想到淘宝搜索商品一样也有大量的图片出现,应该也会遇到相同的问题把。

经过使用淘宝商品检索功能,发现图片列表上下滚动的过程中,图片并不会闪烁的切换,而是用空白图片切换到正确的图片。

想不到问题就这样简单的解决了。

 

 

============

只要在ImageLoader加载图片之前,先清空Image的原图,就不会出现图片从旧图切换到新图的闪烁效果了

 

 

 1 @Override 2     public View getView(int position, View convertView, ViewGroup parent) { 3         ViewHolder holder = null; 4         if (convertView == null) { 5             holder = new ViewHolder(); 6             convertView = inflater.inflate(R.layout.item_gv_picture, null); 7             holder.iv_Picture = (ImageView) convertView 8                     .findViewById(R.id.iv_Picture); 9             convertView.setTag(holder);10         }11         holder = (ViewHolder) convertView.getTag();12 13     14     //处理由于图片重用,导致界面图片闪烁效果15         if(! bitmapEntities.get(position).equals(holder.iv_Picture.getTag())){16             //先将图片置空17             ImageLoader.getInstance().displayImage(18                     "", holder.iv_Picture);19 20             //重新设置图片21             holder.iv_Picture.setTag(bitmapEntities.get(position));22         }23 24         holder.iv_Picture.setScaleType(ScaleType.FIT_XY);25         return convertView;26     }27 28 /*控件缓存类*/29     class ViewHolder {30         ImageView iv_Picture;31     }

 

 

 

 

希望记录下博客可以帮助到有需要朋友。

 

转载于:https://www.cnblogs.com/treekang/p/8963937.html

更多相关文章

  1. RemoteViews 中暗藏的坑
  2. ImageView设置图片的几种方式
  3. Android(安卓)CoordinatorLayout使用 标题由图片变纯色
  4. Android(安卓)ScaleType 详解,使用
  5. Android中如何获取Bitmap(总结)
  6. Android——拍照、剪切、得到图片/从相册中选择照片(api19以上和
  7. Android(安卓)仿百度网页音乐播放器圆形图片转圈播放效果
  8. android 用LruCache读取大图片并缓存
  9. Android逐帧动画,逐帧动画加载图片过多时OOM异常的解决和替代方法

随机推荐

  1. ListView-BaseAdapter
  2. Android专项测试监控资源
  3. android进程间通信:使用AIDL
  4. 动态Android编程
  5. Android(安卓)对话框(Dialog)
  6. Android在任意位置由Notification跳向指
  7. 【Android(安卓)应用开发】 自定义组件
  8. android root实践
  9. Android之RecycleView实现指定范围的拖动
  10. 利用 Python 进行多 Sheet 表合并、多工