在android中使用Adapter,侷限與android內部機制的緣由,listview在加載大量的圖片的過程當中,若是不使用ViewHolder複用的方式,會致使程序產生OOM的問題。android
如下是通常狀況下,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的快速滾動,會致使圖片閃爍替換。
ide
這樣的效果十分難看,致使用戶的體驗很是差,所以開啓在網上搜索解決方案之旅,查了不少都沒有頭緒。忽然靈光一閃,想到淘寶搜索商品同樣也有大量的圖片出現,應該也會遇到相同的問題把。spa
通過使用淘寶商品檢索功能,發現圖片列表上下滾動的過程當中,圖片並不會閃爍的切換,而是用空白圖片切換到正確的圖片。code
想不到問題就這樣簡單的解決了。blog
============圖片
只要在ImageLoader加載圖片以前,先清空Image的原圖,就不會出現圖片從舊圖切換到新圖的閃爍效果了get
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 }
但願記錄下博客能夠幫助到有須要朋友。博客