下午遇到一个很奇怪的问题,修改了ListView中的一个item对象的类型,执行notifyDatasetChange方法后,getView 传过来的convertView类型不对!导致View绘制时调用对象数据错误!!!
- 现象是这样的:
在单个card中执行updateCardView方法时,更新对象类型,直接notifyDataSetChange方法,没有任何问题。
但是改为下面的写法就不行了
new Handler().post(new Runnable(){
public void run(){
adapter.notifyDataSetChange();
}
);
类似的只要将notifyDataSetChange方法放在一个匿名内部类中调用都会有这个问题,例如放在Animation的onAnimationEnd的listener中也会有次问题。
后来发现一个规律,就是改变 item 的obj类型和 notifyDataSetChange在一个代码块,也就是一个方法体内,是没有问题的,但是分开写,就是item 的 obj改变类型在一个方法体内,notifyDataSetChange放在一个匿名内部类中调用就会有上述问题。
最后的解决方法是:
把obj数据类型的改变和notifyDataSetChange都放在匿名内部类中调用。即晚些改变item对应obj的数据类型。但是问题又来了:
在我们工程中的无图模式情况下,滑动中再次出现了ConvertView类型错误问题,一时找不到问题原因。
最终的解决办法:
给ConvertView设置tag,将item对应obj的type类型赋给convertView,在复用convertView的时候,先判断其tag类型,若类型不对,则创建新的convertView,暂时用此方法解决了问题。
但还是不明白convertView为什么会类型错误!!!!
getItemViewType都被调用了,并且position和类型都是匹配对应的,为什么convertView类型系统会传错误呢?