Android 开发中踩过的坑之十三: ListView中的getAdapter

使用Adapter, 有时候为了省事直接强制类型转换, 却出现转换异常,原来

ListView中的getAdapter()方法返回的可能并不是setAdapter传入的那个adapter


为什么? 因为ListView有个特殊功能 : 添加Header和Footer. 

使用ListView的时候可以设置页眉(header)和页脚(footer). 而且可以设置很多页眉和页脚. 

打开源码跟进去细看, 就会发现, 一旦设置里页眉页脚, 那ListView的adapter就变了. 

变成一个"HeaderViewListAdapter"了,  这个HeaderViewListAdapter先包装了你传入的adapter

然后替代它, 当执行getView(), getItem()之类的方法时, 通过运算得出adapter对应的getView(), getItem()结果并返回, 

如此一来, 必然不能将被包装的类强制转换成包装类了.


解决办法倒也简单, 在需要引用的地方添加变量, 或者通过方法参数传入对象就好了. 

但是要注意, adapter通常带有较大的数据, 有时甚至可能保定Context, Veiw, 等大内存的对象.

此时要注意在合适的时机释放所有对adapter的引用(变量置为null). 以保证大对象不会产生内存泄露






你可能感兴趣的:(Android 开发中踩过的坑之十三: ListView中的getAdapter)