问题描述
我在 Leanback 组件中的 HorizontalGridView (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 (将#修改为@)