使用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). 以保证大对象不会产生内存泄露
来源:oschina
链接:https://my.oschina.net/u/1393188/blog/540861