Android 開發中踩過的坑之十三: ListView中的getAdapter

使用Adapter, 有時候爲了省事直接強制類型轉換, 卻出現轉換異常,原來
spa

ListView中的getAdapter()方法返回的可能並非setAdapter傳入的那個adapter對象


爲何? 由於ListView有個特殊功能 : 添加Header和Footer. 內存

使用ListView的時候能夠設置頁眉(header)和頁腳(footer). 並且能夠設置不少頁眉和頁腳. get

打開源碼跟進去細看, 就會發現, 一旦設置裏頁眉頁腳, 那ListView的adapter就變了. 源碼

變成一個"HeaderViewListAdapter"了,  這個HeaderViewListAdapter先包裝了你傳入的adapter變量

而後替代它, 當執行getView(), getItem()之類的方法時, 經過運算得出adapter對應的getView(), getItem()結果並返回, List

如此一來, 必然不能將被包裝的類強制轉換成包裝類了.引用


解決辦法倒也簡單, 在須要引用的地方添加變量, 或者經過方法參數傳入對象就行了. 方法

可是要注意, adapter一般帶有較大的數據, 有時甚至可能保定Context, Veiw, 等大內存的對象.內存泄露

此時要注意在合適的時機釋放全部對adapter的引用(變量置爲null). 以保證大對象不會產生內存泄露

相關文章
相關標籤/搜索