天天看點

關于ListView中getView被重複調用的問題

我用listview顯示資料時,自定義了一個擴充卡(extends arrayadapter),然後重寫了getview方法,現在出現一個問題,就是這個getview()方法被重複調用了,比如我的_data中有兩條資料,但是log.i("show",house.tostring());這句卻被執行了4次甚至更多,請問各位這是神馬情況?

方法代碼如下:

這是自定義的擴充卡:

異步加載圖檔:

這是什麼樣的情況了,看了網上的資料以後我知道原來沒有設定器listview 的布局方式不是fill-parent,而是wrap-content,會計算父控件的高度是以造成了一種反複調用情況,進而次數不确定。

更深層次的解釋為:

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,這個過程會更加漫長。

是以,解決方法就是盡量避免自适應,除非是萬不得已,固定大小或者填充的效果會比較好一些。

繼續閱讀