1在Android的UI组件中,ListView是一个非常实用的组件。该组件主要是用于展示大批量的同类数据,比如联系人信息。
而在自定义ListView的样式时,需要重写数据接口的ListAdapter类中的getView函数,以此来定制ListView中每个item的样式。在这里Android系统为了效率的原因引进了ConvertView这一个变量。ConvertView在这里主要的作用就是方便系统在重写UI时,能重用原来实用过的View实例,以此来降低系统资源的消耗和提高代码效率。 但是当你希望根据itemid实现不同的样式时,往往会出现一些意想不到的情况。这主要是因为两方面的原因导致的
Andorid并不保证getView的执行顺序因为getView的不确定性,导致ConvertView的循序可能是无序的。
简单解释ConvertView就是最近使用过的getView函数返回的实例,但是Andorid是怎样决定使用那个实例传递给本次getView函数的呢? 在经过试验后,我发现关于ConvertView的几点特征。
对于一个ListView,Android保存所有曾经生成过的ConvertView实例,直至系统垃圾回收这些实例位置,而不是只保存最后使用的ConvertView对象。这些保存的ConvertView以使用时间顺序排序,并依次被传递到getView函数中。
以一个简单的例子来会更直观,
我有一列String需要展示
view plain view plain view plain view plain view plaincopy
Context [] c = {1,2,3.......14,16,15} Color [] co = {r,w,...........w,w,r}
由此可见当下次需要调用多个convertView时,输出的颜色顺序将会出错。
总结:由于ListView在执行时,各种操作需要重写的item数是不确定的,同时getView函数调用的顺序也是不确定的,这将导致convertView的数组顺序发生严重的错乱。所以并不建议通过判断position来实现不同的样式,除非不使用convertView
目前避免这种错乱的解决方法,有几种。
不使用convertView,直接每次重新实例化需要的View对象通过外部的静态数组基于itemid或则position值来保存View的Layout,content及style信息,在每次getView函数中都重新赋值。
但是上述两种方法都存在效率损失的问题,目前没有找到太好的解决方法。
</strong |