使用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). 以保證大對象不會產生內存泄露