而在自定義ListView的樣式時,需要重寫數(shù)據(jù)接口的ListAdapter類中的getView函數(shù),以此來定制ListView中每個item的樣式。在這里Android系統(tǒng)為了效率的原因引進了ConvertView這一個變量。ConvertView在這里主要的作用就是方便系統(tǒng)在重寫UI時,能重用原來實用過的View實例,以此來降低系統(tǒng)資源的消耗和提高代碼效率。
但是當(dāng)你希望根據(jù)itemid實現(xiàn)不同的樣式時,往往會出現(xiàn)一些意想不到的情況。這主要是因為兩方面的原因?qū)е碌?/div>
Andorid并不保證getView的執(zhí)行順序因為getView的不確定性,導(dǎo)致ConvertView的循序可能是無序的。
簡單解釋ConvertView就是最近使用過的getView函數(shù)返回的實例,但是Andorid是怎樣決定使用那個實例傳遞給本次getView函數(shù)的呢?
在經(jīng)過試驗后,我發(fā)現(xiàn)關(guān)于ConvertView的幾點特征。
對于一個ListView,Android保存所有曾經(jīng)生成過的ConvertView實例,直至系統(tǒng)垃圾回收這些實例位置,而不是只保存最后使用的ConvertView對象。這些保存的ConvertView以使用時間順序排序,并依次被傳遞到getView函數(shù)中。
以一個簡單的例子來會更直觀,
我有一列String需要展示
view plain view plain view plain view plain view plaincopy
Context [] c = {1,2,3.......14,16,15} Color [] co = {r,w,...........w,w,r}
由此可見當(dāng)下次需要調(diào)用多個convertView時,輸出的顏色順序?qū)鲥e。
總結(jié):由于ListView在執(zhí)行時,各種操作需要重寫的item數(shù)是不確定的,同時getView函數(shù)調(diào)用的順序也是不確定的,這將導(dǎo)致convertView的數(shù)組順序發(fā)生嚴重的錯亂。所以并不建議通過判斷position來實現(xiàn)不同的樣式,除非不使用convertView
目前避免這種錯亂的解決方法,有幾種。
不使用convertView,直接每次重新實例化需要的View對象通過外部的靜態(tài)數(shù)組基于itemid或則position值來保存View的Layout,content及style信息,在每次getView函數(shù)中都重新賦值。
但是上述兩種方法都存在效率損失的問題,目前沒有找到太好的解決方法。
</strong