使用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). 以保证大对象不会产生内存泄露