RecyclerView:检测到不一致。无效的商品位置

我们的质量检查已检测到一个错误:旋转Android设备(Droid Turbo)时,发生了以下与RecyclerView相关的崩溃:


java.lang.IndexOutOfBoundsException:检测到不一致。无效的项目位置2(偏移量:2)。状态:3


在我看来,这看起来像是RecyclerView内部的内部错误,因为我想不出这是由我们的代码直接引起的任何方式...


有没有人遇到这个问题?


解决办法是什么?


一个残酷的解决方法可能是在发生异常时捕获异常并从头开始重新创建RecyclverView实例,以避免陷入损坏状态。


但是,如果可能的话,我想更好地理解问题(也许从源头上解决它),而不是掩盖它。


该错误不容易重现,但是一旦发生就致命。



慕姐4208626
浏览 443回答 3
3回答

幕布斯7119047

我遇到了一个(可能)相关的问题-使用RecyclerView输入活动的新实例,但是使用较小的适配器为我触发了此崩溃。RecyclerView.dispatchLayout()可以在致电前尝试从废料中取出物品mRecycler.clearOldPositions()。结果是它从位置高于适配器大小的公共池中提取项目。幸运的是,只有PredictiveAnimations启用了它才能执行此操作,所以我的解决方案是子类化GridLayoutManager(LinearLayoutManager具有相同的问题和“修复”),并重写supportsPredictiveItemAnimations()以返回false:/** * No Predictive Animations GridLayoutManager */private static class NpaGridLayoutManager extends GridLayoutManager {    /**     * Disable predictive animations. There is a bug in RecyclerView which causes views that     * are being reloaded to pull invalid ViewHolders from the internal recycler stack if the     * adapter size has decreased since the ViewHolder was recycled.     */    @Override    public boolean supportsPredictiveItemAnimations() {        return false;    }    public NpaGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    public NpaGridLayoutManager(Context context, int spanCount) {        super(context, spanCount);    }    public NpaGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {        super(context, spanCount, orientation, reverseLayout);    }}

守候你守候我

我通过mRecycler.setAdapter(itemsAdapter)将所有项目添加到适配器中后延迟了耕作来解决了这一问题,mRecycler.addAll(items)并且它可以正常工作。我不知道为什么要这么做,因为我是从图书馆的代码中查看并以“错误的顺序”看到这些行的,我很确定是这样,请有人能确认它解释为什么所以?甚至不确定这是否是有效答案
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android