关于recyclerView水平滑动和垂直滑动时的崩溃问题

来源:互联网 发布:中国需要几艘航母 知乎 编辑:程序博客网 时间:2024/06/01 08:42
RecyclerView上下滑动的时候崩溃,崩溃信息如下:java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid item position 16(offset:16).state:64android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4957)android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4913)android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4357)android.view.Choreographer$CallbackRecord.run(Choreographer.java:793)android.view.Choreographer.doCallbacks(Choreographer.java:606)android.view.Choreographer.doFrame(Choreographer.java:574)android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:779)android.os.Handler.handleCallback(Handler.java:739)android.os.Handler.dispatchMessage(Handler.java:95)android.os.Looper.loop(Looper.java:135)android.app.ActivityThread.main(ActivityThread.java:5601)java.lang.reflect.Method.invoke(Native Method)java.lang.reflect.Method.invoke(Method.java:372)com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

搜遍了Google,百度,github,stackoverflow……都没有解决,经过两天研究这么解决了:

/** * 去除动画防止,防止出现recyclerView的bug *  */public class MyLinearLayoutManager extends LinearLayoutManager {    public MyLinearLayoutManager(Context context) {        super(context);    }    @Override    public boolean supportsPredictiveItemAnimations() {        return false;    }    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {        try {            super.onLayoutChildren(recycler, state);        } catch (IndexOutOfBoundsException e) {            e.printStackTrace();        }    }    @Override    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {        try {            return super.scrollVerticallyBy(dy, recycler, state);        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }}

Java中如下:

MyLinearLayoutManager myLinearLayoutManager = new MyLinearLayoutManager (mContext);recyclerView.setLayoutManager(myLinearLayoutManager );


RecyclerView水平滑动的时候崩溃,崩溃信息如下:java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid item position 16(offset:16).state:64android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4957)android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4913)android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)android.support.v7.widget.LinearLayoutManager.scrollHorizontanlBy(LinearLayoutManager.java:1043)android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4357)android.view.Choreographer$CallbackRecord.run(Choreographer.java:793)android.view.Choreographer.doCallbacks(Choreographer.java:606)android.view.Choreographer.doFrame(Choreographer.java:574)android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:779)android.os.Handler.handleCallback(Handler.java:739)android.os.Handler.dispatchMessage(Handler.java:95)android.os.Looper.loop(Looper.java:135)android.app.ActivityThread.main(ActivityThread.java:5601)java.lang.reflect.Method.invoke(Native Method)java.lang.reflect.Method.invoke(Method.java:372)com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
/** * 去除动画防止,防止出现recyclerView的bug *  */
public class MyLinearLayoutManager extends LinearLayoutManager {    public MyLinearLayoutManager(Context context) {        super(context);    }    @Override    public boolean supportsPredictiveItemAnimations() {        return false;    }    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {        try {            super.onLayoutChildren(recycler, state);        } catch (IndexOutOfBoundsException e) {            e.printStackTrace();        }    }    @Override    public int scrollHorizontallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {        try {            return super.scrollHorizontallyBy(dy, recycler, state);        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }}
Java中如下:
MyLinearLayoutManager myLinearLayoutManager = new MyLinearLayoutManager (getActivity());myLinearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rv_grid.setLayoutManager(myLinearLayoutManager );rv_grid.setAdapter(imageAdapter);
 

 
阅读全文
0 0
原创粉丝点击