IndexOutOfBoundsException: Invalid index 0, size is 0

692 阅读1分钟

如果是平常的ArrayList,做一下长度的判断,这可是viewPager导致的

完整如下:

2022-02-03 18:52:36.344 6499-6499/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: cn.colorv, PID: 6499
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.get(ArrayList.java:437)
        at androidx.viewpager.widget.ViewPager.performDrag(ViewPager.java:7)
        at androidx.viewpager.widget.ViewPager.onTouchEvent(ViewPager.java:36)
        at android.view.View.dispatchTouchEvent(View.java:14481)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3132)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2800)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3138)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3160)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3138)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3138)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3138)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3138)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2814)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:577)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1889)
        at android.app.Dialog.dispatchTouchEvent(Dialog.java:880)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:527)
        at android.view.View.dispatchPointerEvent(View.java:14740)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6611)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6388)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5810)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5882)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5833)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6027)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5841)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6084)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5814)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5882)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5833)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5841)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5814)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8753)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8704)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8657)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8897)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:221)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:339)
        at android.os.Looper.loop(Looper.java:199)
        at android.app.ActivityThread.main(ActivityThread.java:8296)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)

解决方法有2个,

  1. 重写ViewPager, 但这不是100%管用的
public class OnOffViewPager extends ViewPager {
    public boolean enabled = true;

    public OnOffViewPager(Context context) {
        super(context);
    }

    public OnOffViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(this.enabled) {
            if (getCurrentItem() == 0 && getChildCount() == 0) {
                return false;
            }
            return super.onTouchEvent(ev);
        } else {
            return false;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if(this.enabled) {
            if (getCurrentItem() == 0 && getChildCount() == 0) {
                return false;
            }
            return super.onInterceptTouchEvent(ev);
        } else {
            return false;
        }
    }
}

cause reason: this issue is caused by the source file. In ViewPager setAdaper() mItems will set null.When you darg viewpager and when the setAdapter is called then this issue occured.you can see the performDrag method mItems.get(0) don't add size check.
solve : using notifyDataChanged to refresh data instead of setAdapter.

if(mCarinfoAdapter == null){\
mCarinfoAdapter = new CarInfoViewPagerAdapter(views);\
}else{\
mCarinfoAdapter.setViews(views);\
}\
if(vp_carinfo.getAdapter() == null){\
vp_carinfo.setAdapter(mCarinfoAdapter);\
}else {\
mCarinfoAdapter.notifyDataSetChanged();\
}

第2种方法对我是管用的

参考:# IndexOutOfBoundsException: Invalid index 0, size is 0 #590