notifyItemRemoved的使用

日常bug记录

问题出在列表单个Item删除时出现的
首先,咱用的是IRecyclerView,其次是分页加载,然后就是重点了:
我删除item到第七个时崩溃了,why?带着疑惑去调试了一波,发现原来使用的notifyItemChange()方法不好用,移除的和刷新出来的数据不对,然后调整为notifyItemRemove()方法,发现好用多了,使用代码如下
//index为当前选中的item的位置position
 mDatas.remove(index);
 notifyItemRemoved(index);
 notifyItemRangeChanged(index,mDatas.size()- index);
可是这样写完后依然有问题,还是删除到指定个数会崩溃,why?哪儿出岔子了,debug调试查看发现IRecyclerView中setAdapter时会调用一个底层adapter——WrapperAdapter
问题就是出在它身上,当中的getItemViewType()方法如下
@Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return REFRESH_HEADER;
        } else if (position == 1) {
            return HEADER;
        } else if (1 < position && position < mAdapter.getItemCount() + 2) {
            return mAdapter.getItemViewType(position - 2);
        } else if (position == mAdapter.getItemCount() + 2) {
            return FOOTER;
        } else if (position == mAdapter.getItemCount() + 3) {
            return LOAD_MORE_FOOTER;
        }

        throw new IllegalArgumentException("Wrong type! Position = " + position);
    }
不错,乍一看,没问题啊,调试打印position才发现,position会吵出判断层走向throw,那如果超过了怎么处理呢,没有?真tm醉了,这都不处理,你不崩溃谁崩溃呢,于是我在最后一个position的判断稍微修改了下,修改后如下:
@Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return REFRESH_HEADER;
        } else if (position == 1) {
            return HEADER;
        } else if (1 < position && position < mAdapter.getItemCount() + 2) {
            return mAdapter.getItemViewType(position - 2);
        } else if (position == mAdapter.getItemCount() + 2) {
            return FOOTER;
        } else if (position >= mAdapter.getItemCount() + 3) {
            return LOAD_MORE_FOOTER;
        }

        throw new IllegalArgumentException("Wrong type! Position = " + position);
    }
这样终于回归正常了,有时候你不服是不行的,尽管自己写的漏洞百出,可是用别人写的难道就不会有问题吗,还是不够严谨的判断逻辑,继续加油吧打工人!

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值