recycleView 遇到IndexOutOfBoundsException 及解决

事情是这样的 

我在activity 中继承的MVPView,通过presenter加载输入,然后调用MVPview中的下面这个方法"

 
  @Override
    public void setLocationData(List<Location> locationData) {
        locationList.clear();
        locationList.addAll(locationData);
        chooseLocationAdapter.notifyItemRangeInserted(0, locationData.size()+1);
//        chooseLocationAdapter.notifyDataSetChanged();
    }

结果报了下面这个错误

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder

排除了List的数组越界问题后,我想到了可能是recycleView的一个BUG.

果然,在Google一番之后发现确实有这个问题

1
down vote
It is a bug of RV, see the discussion here.
In most cases, use notifyDataSetChanged() will avoid this crash, but it will kill Animation and Performance.

按照上面这个回答,我改成了

chooseLocationAdapter.notifyDataSetChanged();

果然问题解决了.不过又转念一想,既然这这个notify的问题,或许,这样试试?


 <span style="white-space:pre">	</span>locationList.clear();
        chooseLocationAdapter.notifyDataSetChanged();
        locationList.addAll(locationData);
        chooseLocationAdapter.notifyItemRangeInserted(0, locationData.size()+1);
是的,清除数据后notify一次,加载数据在notify一次,问题解决了!


不要老是想着是个BUG,也许是自己的调用不和规范呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值