本文主要介紹ListView中item view的重復(fù)使用、可能帶來的出錯情況以及解決方案。
1、為什么item View重復(fù)使用及如何重復(fù)使用 熟悉ListView的朋友都知道,在ListView的每個item需要花較大的時間進行渲染(比如需要網(wǎng)絡(luò)獲取數(shù)據(jù)、圖片)時,為了使得ListView能夠平滑的上下滑動,需要對listView的adapter做一些性能優(yōu)化,比如數(shù)據(jù)(圖片)異步加載、重復(fù)使用item的view。
其中item的重復(fù)使用代碼如下
可以發(fā)現(xiàn)上面主要通過判斷convertView若不為空進行重復(fù)使用,節(jié)省資源加載和創(chuàng)建的時間。然后這種重用之前的convertView會對當(dāng)前的顯示有一定影響。
2、可能出錯情況 a、convertView包含TextView 之前的convertView會顯示某個textView,但當(dāng)前我并不需要顯示了沒有問題,而因為重用會導(dǎo)致仍會顯示。
b、convertView包含ImageView,且異步設(shè)置ImageView中ImageResource時的問題 調(diào)試adapter的getView函數(shù)就會發(fā)現(xiàn),頭3個item都是重用第1個item的,所以若異步修改第2和第3個item的imageView第1個也會被修改,導(dǎo)致第1個item的imageView不斷閃爍 我的補充: 這種情況發(fā)生的原因是因為ListView沒辦法確定它一次需要實例化多少個 convertView,即調(diào)用多少次getView方法。而導(dǎo)致這樣的結(jié)果可能有以下原因: 1、你自己重寫的ListView在實例化以后直接使用,而沒有給它指定高度和寬度。 2、將ListView布局在xml中高度值指定為了Wrap_Content 3、將ListView布局到一個父組件,ListView本身的height是fillParent,但是父類組件在其父組件中高度為Wrap_Content 等 如:
c、convertView包含TextView ,且異步設(shè)置 TextView中圖片時的問題 在textView中使用setCompoundDrawablesWithIntrinsicBounds添加圖片,若第3個item 的textView異步添加了圖片,第1個也會相應(yīng)被加上
具體原因還沒debug出來,暫時的解決方法有兩個 3、解決方案 a、正確性優(yōu)先,去除性能優(yōu)化 ===== 我不大贊成,以上所有的出錯方案都可以通過調(diào)整邏輯來達到理想效果并且保持性能 即不再重用convertView,每次重新賦值
b、初始化每個Item View中的出錯元素 比如對于可能出錯情況a的解決如下:
其中if (contentList.get(position) == null) 即表示消除之前的convertView的影響。 其他元素初始設(shè)置類似,如ImageView的ImageResource。
這種方法對于很多View需要初始化時較麻煩,若出錯view太多還是使用第一種解決方案方便些,畢竟很多時候性能不會那么差。 |
|