java.lang.IndexOutOfBoundsException:检测到不一致 androidx.leanback.widget.Horizo​​ntalGridView

问题描述

我在 Leanback 组件中的 Horizo​​ntalGridView (RecyclerView) 中遇到此崩溃

设备:Android TV

安卓版本:9

逻辑:

我的适配器扩展 ListAdapter,我将向其提交数据列表,该列表将使用 DiffUtils 在内部处理对适配器的通知。 每当收到新的数据列表时,我只是获取适配器的实例并提交新的数据列表。现在 listadapter 将根据 diff 逻辑在内部通知更改。 下面是示例代码



    if (myViewHolder.getHorizontalGridView().getAdapter() instanceof MyAdapter) {
        MyAdapter myAdapter = (MyAdapter) myViewHolder.getHorizontalGridView().getAdapter();
        myAdapter.submitList(dataList);
    } else {
        MyAdapter myAdapter = new MyAdapter(context);
        myViewHolder.getHorizontalGridView().setAdapter(myAdapter);
        myAdapter.submitList(dataList);
    }

每当适配器中收到任何新数据列表的通知时,当我在同一时刻滚动时,我都会面临以下崩溃。

崩溃日志:

 

    2021-03-09 10:31:17.213 9746-9746/? E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.MyApplication.tv,PID: 9746
        java.lang.indexoutofboundsexception: Inconsistency detected. Invalid item position 9(offset:18).state:17 androidx.leanback.widget.HorizontalGridView{fdd0e8f VFE...... ......ID 0,98-1760,267 #7f0b098b app:id/railID},adapter:com.MyApplication.tv.adapter.MyAdapter@7447afe,layout:androidx.leanback.widget.GridLayoutManager@415f25f,context:com.MyApplication.tv.MainActivity@358a4f0
            at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6183)
            at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
            at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
            at androidx.leanback.widget.GridLayoutManager.getViewForPosition(GridLayoutManager.java:1085)
            at androidx.leanback.widget.GridLayoutManager$2.createItem(GridLayoutManager.java:1613)
            at androidx.leanback.widget.SingleRow.appendVisibleItems(SingleRow.java:113)
            at androidx.leanback.widget.Grid.appendVisibleItems(Grid.java:397)
            at androidx.leanback.widget.GridLayoutManager.appendVisibleItems(GridLayoutManager.java:1934)
            at androidx.leanback.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:2219)
            at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4085)
            at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3849)
            at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1897)
            at androidx.recyclerview.widget.RecyclerView$1.run(RecyclerView.java:414)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
            at android.view.Choreographer.doCallbacks(Choreographer.java:761)
            at android.view.Choreographer.doFrame(Choreographer.java:693)
            at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:935)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6718)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

据我对这次崩溃的理解,当 RecyclerView 找不到该位置的 ViewHolder 时,它会在内部抛出异常。 内部 RecyclerView.tryGetViewHolderForPositionByDeadline 方法看起来像(从 Android Studio 复制)



    // 1) Find by position from scrap/hidden list/cache
    if (holder == null) {
        holder = getScrapOrHiddenorCachedHolderForPosition(position,dryRun);
        if (holder != null) {
            if (!validateViewHolderForOffsetPosition(holder)) {
                // recycle holder (and unscrap if relevant) since it can't be used
                if (!dryRun) {
                    // we would like to recycle this but need to make sure it is not used by
                    // animation logic etc.
                    holder.addFlags(ViewHolder.FLAG_INVALID);
                    if (holder.isScrap()) {
                        removeDetachedView(holder.itemView,false);
                        holder.unScrap();
                    } else if (holder.wasReturnedFromScrap()) {
                        holder.clearReturnedFromScrapFlag();
                    }
                    recycleViewHolderInternal(holder);
                }
                holder = null;
            } else {
                fromScrapOrHiddenorCache = true;
            }
        }
    }
    if (holder == null) {
        final int offsetPosition = mAdapterHelper.findPositionOffset(position);
        if (offsetPosition = mAdapter.getItemCount()) {
            throw new indexoutofboundsexception ("Inconsistency detected. Invalid item "
                    + "position " + position + "(offset:" + offsetPosition + ")."
                    + "state:" + mState.getItemCount() + exceptionLabel());
        }
    }

我尝试了此线程中的解决方RecyclerView: Inconsistency detected. Invalid item position解决方案对我不起作用:(

解决这个问题的方法是什么?如果我知道处理这个问题的解决方案或我在处理这种情况时缺少的任何东西,那就太好了:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...