在RecycleView.Adapter 的 onBinderViewHolder 中刷新adapter报错的问题

我在我自己的项目中使用到了RecycleView,然后在RecycleView.Adapter中的onBinderViewHolder中刷新了我的adapter。

然后报了如下错误:


java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 3(offset:3).state:4。


我项目的需求大概是:在一个viewpager + fragment 中分为两个viewpage,在第一个中修改数据需要第二个响应,第二个页面使用的是Reacycle + CardView 。第二个页面还有一个滑动整屏的功能。在之前的博文中提到了删除的方法,但当删除第一个和中间的item的时候,程序就会崩溃,报上述错误。在google中查了一下,在stackFlow里有问题但是没有答案,找到了一位前辈写的博文说是禁止滑动,我试了一下对于我的需求不管用,我就尝试使用了另一种方法。


首先我一开始没有发现错误的原因,后来发现我的adapter的数据源使用的是一个ArrayList,当我在第一个页面删除数据之后会在handler里处理更新adapter,而这里会更新list,并且调用RecycleView.Adapter的getItemCount() 和 onBinderViewHolder。


上面是log打印出来的信息。

我在每次调用onBindViewHolder 的时候打印出了我数据,我发现是这样的问题,例如我的没有删除之前的数据是 [张三,李四,王五],这时会根据position=0得到 ”张三“ 这个数据,但是在数据库中我已经删除了张三这个字段(包含有张三这个字段的数据,假设是最后一条含有“张三”的数据),这是position = 0  并且执行list.remove(position),在执行了该语句之后,list将由[张三,李四,王五] 变为 [李四,王五]而这时的position变为1,读取出王五的数据,所以李四没有读取,程序报错。 


找到问题的原因之后解决起来就比较容易了,首先我们要知道:


这个方法的参数position 是来自于 ViewHolder.getAdapterPosition()这个方法。所以我们对position做一下限制就可以啦。 注意的是如果在一些情况下你的代码对getAdapterPosition()返回的position做了操作,一定要改变getItemCount()中返回的 list.size()。否则程序也会报上述错误。


这是我想出来的针对我的需求的方法,应该还有更好的解决方法。希望看到这篇博文的朋友能够指出。谢谢大家! 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值