上一篇博客写了 ListView的getViewTypeCount的局限性,因此订单列表改为了listView嵌套ListView的方式,功能也是可以实现,有个不好的体验就是,在性能比较差的机器上拖动的时候会有卡顿的现象,后来偶然看到http://blog.csdn.net/Ideaqjjl/article/details/51043644这篇博客,感觉这种方法可行,也不难,下面就说改动过程中遇到的问题:
1、在改动的过程中,因为是listView,所以总是本着复用的原则,在上面那篇博客的基础上加上了复用机制,在OrderTop、OrderMiddle以及OrderBottom中加入了
if (convertView == null) {
convertView = inflater.inflate(getLayout(), null);
viewHolder = new ViewHolder();
.....
.....
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
运行,滚动listView,crash,
ClassCastException: OrderTop$ViewHolder cannot be cast to OrderBottom$ViewHolder
,还是想的太简单了。
默认情况下,listView只缓存一种布局,而根据我们的做法,是有三个不同的布局,而且这三个布局样式是固定的,不会根据后台返回的数据内容而改变,因此这时候就想到用上getItemViewType以及getViewTypeCount两个方法,
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
OrderContent orderContent = orderContents.get(position);
if (orderContent instanceof OrderTop) {
return ITEM_TOP;
} else if (orderContent instanceof OrderMiddle) {
return ITEM_MIDDLE;
} else if (orderContent instanceof OrderBottom) {
return ITEM_BOTTOM;
}
return super.getItemViewType(position);
}
运行,搞定,滚动效果比listView嵌套listView流程多了,真的是成也getItemViewType以及getViewTypeCount,败也getItemViewType以及getViewTypeCount。
这里,顺带提下,上面写到的ITEM_TOP、ITEM_MIDDLE、ITEM_BOTTOM一定得比getViewTypeCount()方法返回的结果小,否则会报错:ArrayIndexOutOfBoundsException: length=3; index=4