当前位置: 首页 > 知识库问答 >
问题:

差异调度导致检测到“不一致性”。无效视图保持器适配器PositionViewHolder有时出错

万俟皓
2023-03-14

我有一个RxJava2可观察到,它接受两个列表,为它们计算diff结果,并将此数据发送到适配器。适配器在主线程上调度更新。

 public void dispatchStreams(List<StreamV3> streams, @Nullable DiffUtil.DiffResult diffResult) {

    if (streams == null) return;

    streamsList.clear();
    streamsList.addAll(streams);

    if (diffResult != null) {
        diffResult.dispatchUpdatesTo(this);
    }
}

我检测到不一致。在某些设备上有时出现无效视图保持器适配器PositionViewHolder错误。我也搞不清我的代码出了什么问题。最小SDK 21,目标SDK 26,RecyclerView版本为26.0.0。我知道扩展LinearLayoutManager和静默捕获此错误的解决方案,但这是一个糟糕的解决方案,我相信这里应该是一个更好的解决方案。

谁能提供帮助吗?

共有1个答案

仲孙超
2023-03-14

我在这个答案中找到了解决这个问题的方法

这个问题似乎是由布局管理器上的supportsPredictiveItemAnimations属性引起的。当我将其设置为false时,不再发生崩溃。

public class LinearLayoutManagerWrapper extends LinearLayoutManager {

 public LinearLayoutManagerWrapper(Context context) {
   super(context);
 } 

 public LinearLayoutManagerWrapper(Context context, int orientation, boolean reverseLayout) {
   super(context, orientation, reverseLayout);
 }

 public LinearLayoutManagerWrapper(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
   super(context, attrs, defStyleAttr, defStyleRes);
 }

 @Override
 public boolean supportsPredictiveItemAnimations() {
   return false;
 }
}
 类似资料: