android listview異步加載圖片錯位,重復,閃爍分析以及解決方案

我們在使用listview異步加載圖片 的時候,在快速滑動或者網絡不好的情況下,會出現圖片錯位,重復,閃爍等問題,其實這些問題總結起來就是一個問題,

比如listview上有100個item,一屏隻顯示10個item,我們知道getView()中converView是用來復用view對象的,因為一個item的view對象,而imageview控件就是view通過findViewById()獲得的,而我們在復用view對象時,也就是說這個imageview也被復用瞭,比如第11個item的view復用瞭第一個itemv iew對象,那麼imageview就同時被復用瞭,而顯示圖片是通過imageview控件,所以當圖片沒下載出來,就這個imageview顯示的數據就是復用的數據

1:item圖片顯示重復?

這個顯示重復是指當前行item顯示瞭之前某行item的圖片

比如ListView滑動到第2行會異步加載某個圖片,但是加載很慢,加載過程中listView已經滑動到瞭第14行,且滑動過程中該圖片加載結束,
第2行已不在屏幕內,根據上面介紹的緩存原理,第2行的view可能被第14行復用,這樣我們看到的就是第14行顯示瞭本該屬於第2行的圖片,造成顯示重復

行item圖片顯示錯亂?
這個顯示錯亂是指某行item顯示瞭不屬於該行item的圖片。?
比如ListView滑動到第2行會異步加載某個圖片,但是加載很慢,加載過程中listView已經滑動到瞭第14行,第2行已不在屏幕內,
根據上面介紹的緩存原理,第2行的view可能被第14行復用,第14行顯示瞭第2行的View,這時之前的圖片加載結束,就會顯示在第14行,造成錯亂

行item圖片顯示閃爍?
上面b的情況,第14行圖片又很快加載結束,所以我們看到第14行先顯示瞭第2行的圖片,立馬又顯示瞭自己的圖片進行覆蓋造成閃爍錯亂

解決方案:

通過上面的分析我們知道瞭出現錯亂的原因是異步加載及對象被復用造成的,如果每次

getView

能給對象一個標識,

在異步加載完成時比較標識與當前行

item

的標識是否一致,

致則顯示,否則不做處理即可

通過上面的分析我們知道瞭出現錯亂的原因是異步加載及對象被復用造成的,如果每次

getView

能給對象一個標識,

在異步加載完成時比較標識與當前行

item

的標識是否一致,

致則顯示,否則不做處理即可

通過上面的分析我們知道瞭出現錯亂的原因是異步加載及對象被復用造成的,如果每次getView能給對象一個標識,在異步加載完成時比較標識與當前行item的標識是否一致,一致則顯示,否則不做處理即可

原理:首先給imageview設置一個tag,這個tag中設置的是url,然後在加載的時候取得這個url和要加載那position中的url對比,如果不相同就加載,相同就是復用以前的就不加載瞭

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *