今天遇到一个BUG,特此记录,以后再遇到直接用,据多数人的吐槽可看出是Android官方的BUG。
RecyclerView在刷新数据时,滑动列表会导致崩溃
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21(offset:21.state:20
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:524)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)
综合有三种解决办法:
1.继承LinearLayoutManager,复写 supportsPredictiveItemAnimations 返回false,取消动画部分
2.重写RecyclerView的OnTouchListener,在刷新时用一个布尔值去处理列表是否可以滑动
3.在Add和clear操作时立马执行 notifyDataSetChanged方法
然而三种方法都试了并没有什么卵用。
最后找到一位大神说clear数据要在拿到新数据之后。。
所以简单的把这个clear数据的操作放在获取数据之后即可解决。
当然也有可能是代码不同,具体情况具体分析