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


RecyclerView上下滑动的时候崩溃,崩溃信息如下:
java.lang.IndexOutOfBoundsException
Inconsistency detected. Invalid item position 16(offset:16).state:64
android.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.IndexOutOfBoundsException
Inconsistency detected. Invalid item position 16(offset:16).state:64
android.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);
 
 
 
   
 
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_33523706/article/details/72827776