类似淘宝订单列表的改进

上一篇博客写了 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值