RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解决方案(转)

转自:RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解决方案

RecyclerView是Android-support-v7-21版本中新增的一个Widget,RecyclerView在刷新数据的时候会出现以下异常:

[java] view plain copy

  1. java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{431a7450 position=1 id=-1, oldPos=-1, pLpos:-1 scrap [attachedScrap] tmpDetached no parent}
  2. at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4251)
  3. at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4382)
  4. at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
  5. at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
  6. at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
  7. at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
  8. at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
  9. at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
  10. at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
  11. at android.view.View.layout(View.java:14828)
  12. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  13. at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:584)
  14. at android.view.View.layout(View.java:14828)
  15. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  16. at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
  17. at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
  18. at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
  19. at android.view.View.layout(View.java:14828)
  20. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  21. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  22. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  23. at android.view.View.layout(View.java:14828)
  24. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  25. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  26. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  27. at android.view.View.layout(View.java:14828)
  28. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  29. at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
  30. at android.view.View.layout(View.java:14828)
  31. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  32. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  33. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  34. at android.view.View.layout(View.java:14828)
  35. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  36. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  37. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  38. at android.view.View.layout(View.java:14828)
  39. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  40. at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
  41. at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
  42. at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
  43. at android.view.View.layout(View.java:14828)
  44. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  45. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  46. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  47. at android.view.View.layout(View.java:14828)
  48. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  49. at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
  50. at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
  51. at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
  52. at android.view.View.layout(View.java:14828)
  53. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  54. at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
  55. at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
  56. at android.view.View.layout(View.java:14828)
  57. at android.view.ViewGroup.layout(ViewGroup.java:4631)
  58. at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2074)
  59. at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1831)
  60. at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1087)
  61. at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5696)
  62. at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
  63. at android.view.Choreographer.doCallbacks(Choreographer.java:574)
  64. at android.view.Choreographer.doFrame(Choreographer.java:544)
  65. at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
  66. at android.os.Handler.handleCallback(Handler.java:733)
  67. at android.os.Handler.dispatchMessage(Handler.java:95)
  68. at android.os.Looper.loop(Looper.java:136)
  69. at android.app.ActivityThread.main(ActivityThread.java:5016)
  70. at java.lang.reflect.Method.invokeNative(Native Method)
  71. at java.lang.reflect.Method.invoke(Method.java:515)
  72. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
  73. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
  74. at dalvik.system.NativeStart.main(Native Method)

大家看这个代码,只是并没有报到我们自己的代码里面来,在底层就崩溃了,在app层面并没有,弹出一个框,说应用程序已奔溃,而是直接就没了,用户感觉很奇怪。这种异常并不是很容易出现,而是偶尔出现,我的也是在后台奔溃日志中,发现了这种异常,我们自己都不知道什么地方报错的,搜索百度,发现有个链接的权重比较高,看的人也比较多:

http://drakeet.me/recyclerview-bug-indexoutofboundsexception-inconsistency-detected-invalid-item-position-solution?utm_source=tuicool&utm_medium=referral
但是,这篇文章写得比较模糊,解决方案也只是给出一个代码片段,我都不知道怎么加进去,之后我用google去搜索,发现这个问题很普遍,很多都是偶尔出现,很难去重现他,终于在stackoverflow上找到了一个解决方法,链接如下:

http://stackoverflow.com/questions/31759171/recyclerview-and-java-lang-indexoutofboundsexception-inconsistency-detected-in

其实也不是什么解决方法,只是把这个异常捕获了,不让他奔溃了,这个问题的终极解决方案还是得让google去修复。

1、创建一个类LinearLayoutManagerWrapper继承LinearLayoutManager,重写onLayoutChildren方法

[java] view plain copy

  1. public class WrapContentLinearLayoutManager extends LinearLayoutManager {
  2. public WrapContentLinearLayoutManager(Context context) {
  3. super(context);
  4. }
  5. public WrapContentLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
  6. super(context, orientation, reverseLayout);
  7. }
  8. public WrapContentLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  9. super(context, attrs, defStyleAttr, defStyleRes);
  10. }
  11. @Override
  12. public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
  13. try {
  14. super.onLayoutChildren(recycler, state);
  15. } catch (IndexOutOfBoundsException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

2、设置RecyclerView的布局管理为WrapContentLinearLayoutManager对象

[java] view plain copy

  1. mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

我经过大量的测试,发现这个异常真的被catch了,没有再出现这种崩溃的问题了,大功告成,希望对大家有所帮助!!!

时间: 2024-10-06 18:24:52

RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解决方案(转)的相关文章

【转载】Android RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid item position

转载自:Drakeet的个人博客 RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid item position 今早我更新了 Android Studio 1.2 Preview 和 22 版本的 sdk,包括兼容库也更新到 22.0.0,但是令人失望的是,RecyclerView 存在的一个明显的 bug 仍然没有修复: java.lang.IndexOutOfBoundsException:

滑动RecyclerView时出现异常: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 6(offset:6).state:30

RecyclerView 存在的一个明显的 bug 一直没有修复: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position… 重现的方法是:使用 RecyclerView 加官方下拉刷新的时候,如果绑定的 List 对象在更新数据之前进行了 clear,而这时用户紧接着迅速上滑 RV,就会造成崩溃,而且异常不会报到你的代码上,属于RV内部错误.初次猜测是,当你 clear 了 list

RecycleView Bug:java.lang.IndexOutOfBoundsException: Inconsistency detected.

今天使用RecyclerView时,上下两个RecyclerView,在实现下拉刷新时,报错: java.lang.IndexOutOfBoundsException: Inconsistency detected.   Invalid view holder adapter positionViewHolder{56798b2 position=2 id=-1, oldPos=2, pLpos:-1 scrap [attachedScrap] tmpDetached no parent} 在网

java.lang.IndexOutOfBoundsException: Inconsistency detected.

1 这个bug 网上小找一下,发现解决办法都很奇怪,还有的谁是recycleview的bug,喝喝 2  这个bug 主要是你在刷新的时候 调用了list.clear 并且还滑动了 3 解决办法 在list.clear() 之后在 adapter_.notifyDataSetChanged(); 4 还有就是在那个返回值之后再去 list.clear(); 5 如果不对留言讨论

RecyclerView的bug——Inconsistency detected

bug重现的方法 使用 RecyclerView 加SwipeRefreshLayout下拉刷新的时候,如果绑定的 List 对象在更新数据之前进行了 clear,而这时用户紧接着迅速上滑 RecyclerView,就会造成崩溃,而且异常不会报到我们的代码上,属于RecyclerView内部错误. 可能的原因 当 clear 了 list 之后,这时迅速上滑,而新数据还没到来,导致 RecyclerView 要更新加载下面的 Item 时候,找不到数据源了,造成 crash,就会报以下错误 ja

BUG:mysql 5.6 Invalid use of GRANT/REVOKE command breaks replication

bug描述:当使用revoke,grant命令收回,授予权限出错时(语法错误除外),会导致主从同步异常终止.如: mysql> revoke select on *.* from aaa; ERROR 1141 (42000): There is no such grant defined for user 'aaa' on host '%'     该用户没有该权限却执行了回收该权限 mysql> GRANT FILE ON test.* TO [email protected]; ERRO

关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案

重装了VS2010,在编译程序时出现了"error: LNK1123: failure during conversion to COFF: file invalid or corrupt "这个错误,意思是由于COFF标识转换失败.而在连接中完成此项工作的是cvtres.exe.这个错误的原因是存在多个版本的cvtres.exe. 系统目录:C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe C:\Windows\Micr

view的滑动冲突解决方案

一.常见的滑动冲突场景 1.外部滑动方向和内部滑动方向不一致 2.外部滑动方向和内部滑动方向一致 3.上面两种情况的嵌套 二.滑动冲突处理的原则 场景1的处理原则是:当用户左右滑动时,需要让外部的view拦截点击事件,当用户上下滑动时,需要让内部的view拦截点击事件.场景2和场景3比较特殊,无法如同场景1一样原则的处理冲突,需要在业务上寻找突破点.比如业务上规定:当处于某种状态时需要外部View响应用户的滑动,而处于另一种状态时则需要内部View来响应View的滑动,根据这种业务上的需求我们也

关于android.view.WindowLeaked异常的解决方案

虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考. Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框.PopupWindow也有相应的WindowManager窗体管理器.因为对话框.PopupWi