日常bug记录
问题出在列表单个Item删除时出现的
首先,咱用的是IRecyclerView,其次是分页加载,然后就是重点了:
我删除item到第七个时崩溃了,why?带着疑惑去调试了一波,发现原来使用的notifyItemChange()方法不好用,移除的和刷新出来的数据不对,然后调整为notifyItemRemove()方法,发现好用多了,使用代码如下
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);
}
这样终于回归正常了,有时候你不服是不行的,尽管自己写的漏洞百出,可是用别人写的难道就不会有问题吗,还是不够严谨的判断逻辑,继续加油吧打工人!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210208140816229.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RvdGFfd3k=,size_16,color_FFFFFF,t_70#pic_center)