Android ListView反複調用getView和getCount
最近做項目發現一個界麵當有ListView是,getView和getCount中的log被瘋狂調用。一個5個Item的ListView,getView竟然會被反複調用7組。尤其是當ItemView中需要加載圖片時,很容易造成GC過多,很容易出現ANR。
原因就在於measure過程,ListView一般都會有好多個Item,而且也會同時顯示若幹組Item,這些Item的父元素都是這個ListView。
更具Google的解釋,View在Draw的時候分成兩個階段:measure和layout,在measure階段時主要就是為了計算兩個參數:height和width。而且要注意的是,這是個遞歸的過程,從頂向下,DecorView開始依次調用自己子元素的measure。計算完成這兩個參數後就開始layout,最後再是draw的調用。
對於ListView,當然每一個Item都會被調用measure方法,而在這個過程中getView和getCount會被調用,而且看用戶的需求,可能會有很多次調用。
而為什麼會有很多組次調用呢?
問題就在於在layout中的決定ListView或者它的父元素的height和width屬性的定義了。fill_parent會好一點,計算方法會比較簡單,隻要跟父元素的大小相似就行,但是即使是fill_parent,也不能給View當飯吃,還是要計算出來具體的dip,所以measure還是會被調用,隻是可能比wrap_content的少一點。至於自適應的它會一直考量它的寬和高,根據內容(也就是它的子Item)計算寬高。可能這個measure過程會反複執行,如果父元素也是wrap_content,這個過程會更加漫長。
所以,解決方法就是盡量避免自適應,除非是萬不得已,固定大小或者填充的效果會比較好一些。
最後更新:2017-04-02 06:51:49