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

相关文章
相关标签/搜索