天天看點

ListView異步加載網絡圖檔之二

[align=center][size=large][b]ListView異步加載網絡圖檔之二[/b][/size][/align]

[size=large] 上一篇文章中賣了一個關子,遺留下來兩個bug,不知道有沒有同學發現,或者已經解了,那麼這一篇文章我将解決其中一個bug(呵呵繼續賣。。。)[/size]

[size=large][b]問題描述:[/b]當我們把清單向下滾動再向上滾動反複的操作,本來應該是iteye的logo和妮露(看死神的同學應該知道)交替顯示的,但是悲劇卻發生了,圖檔亂了。

[b]問題産生的原因:[/b]由于listview中清單項的view是複用的,當背景傳回圖檔,并執行onPostExecute方法中調用這一句mViewHolder.mImageView.setImageBitmap(result)的時候,他會影響到所有複用的item,而這個時候你的清單已經滾動了,是以你就看到圖檔顯示不正常了。

[b]問題解決方案:[/b]根據問題産生的原因,我們就[color=red]不要在onPostExecute方法中去調用[/color]mViewHolder.mImageView.setImageBitmap(result)方法,[color=red]那麼我們應該在哪兒調用呢?[/color]這兒不調用,那麼我們的imageview怎麼知道圖檔已經下載下傳好了呢?我們隻需要[color=red]調用adapter的notifyDataSetChanged()[/color]方法,他會觸發getView方法的調用,而在getView方法中就直接去緩存中拿圖檔了([color=red]這樣在螢幕可見範圍的item都是正常的,不可見的無聊他顯示神馬我們都不用關心[/color]),是以在onPostExecute方法中我們隻需要将下載下傳好的圖檔放入緩存,并且通知adapter資料發生了變化。

[/size]

[size=large][b]總結:[/b]說了這麼多,我也不知道看這篇文章的同學能不能夠看懂,這個問題還是挺繞的,我的文字表達能力很有限。如果不明白的可以單聊。[color=red]當然這個bug是解決了,還有一個更嚴重的bug,可以直接讓我們脆弱的demo崩掉,不信你試一試,預知詳解,敬請關注下一期部落格[/color][/size]

繼續閱讀