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 }
希望记录下博客可以帮助到有需要朋友。