Adapter 优化图片复用,导致界面图片出现闪烁效果

在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     }

 

 

 

 

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

 

posted @ 2018-04-27 18:42  HealthTree  阅读(985)  评论(0编辑  收藏  举报