listview 異步加載圖片并防止錯位

1.圖片錯位原理:
如果我們只是簡單顯示list中數據,而沒用convertview的復用機制和異步操作,就不會產生圖片錯位;重用convertview但沒用異步,也不會有錯位現象。但我們的項目中list一般都會用,不然會很卡。 在上圖中,我們能看到listview中整屏剛好顯示7個item,當向下滑動時,顯示出item8,而item8是重用的item1,如果此時異步網絡請求item8的圖片,比item1的圖片慢,那么item8就會顯示item1的image。當item8下載完成,此時用戶向上滑顯示item1時,又復用了item8的image,這樣就導致了圖片錯位現象(item1和item8是用的同一塊內存哦)。
2.解決方法:
對imageview設置tag,并預設一張圖片。 向下滑動后,item8顯示,item1隱藏。但由于item1是第一次進來就顯示,所以一般情況下,item1都會比item8先下載完,但由于此時可見的item8的tag,和隱藏了的item1的url不匹配,所以就算item1的圖片下載完也不會顯示到item8中,因為tag標識的永遠是可見圖片中的url。
// 給 ImageView 設置一個 tag
holder.img.setTag(imgUrl);
// 預設一個圖片
holder.img.setImageResource(R.drawable.ic_launcher);
// 通過 tag 來防止圖片錯位
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) {
imageView.setImageBitmap(result);
}
浙公網安備 33010602011771號