SwipeToAction icon indicating copy to clipboard operation
SwipeToAction copied to clipboard

pointerIndex out of Range error

Open Davit-Al opened this issue 9 years ago • 4 comments

Sometimes I get this error when I am scrolliing. Here is stacktrace:

java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method) at android.view.MotionEvent.getX(MotionEvent.java:2069) at co.dift.ui.SwipeToAction$1.onTouch(SwipeToAction.java:91) at android.view.View.dispatchTouchEvent(View.java:7784) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)

Davit-Al avatar Jan 19 '16 10:01 Davit-Al

I have the same error. Just to drag left-right is enough. device 4.2.2

daniil-pastuhov avatar Feb 25 '16 11:02 daniil-pastuhov

same problem ...

hadidez avatar Dec 14 '16 06:12 hadidez

+1. Same problem

riki-dexter avatar May 09 '18 08:05 riki-dexter

I found this page: https://blog.csdn.net/nnmmbb/article/details/28419779 It may be a bug of Android system.

I have read the source code of SwipeToAction, and find it set an onTouchListener

...
private void init() {
        recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent ev) {
                switch (ev.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN: {
                        // http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html
                        activePointerId = ev.getPointerId(0);
...
...
                    case MotionEvent.ACTION_MOVE: {
                        final int pointerIndex = ev.findPointerIndex(activePointerId);
                        final float x = ev.getX(pointerIndex);// crash here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        final float dx = x - downX;
...

It doesn't check the validity of the pointerIndex , so it crashed. I don't want to edit the source code, I avoid it by extends the RecycleView and override the setOnTouchListener method, in the setOnTouchListener method, I construct a static proxy of the true OnTouchListener created by SwipeToAction. and warp the true onTouch method with try{...}catch block, which catched the Exception.

my code:


public class FixExceptionRecycleView extends RecyclerView {
    private static final String LOG_TAG = "FixExceptionRecycleView";

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

    public FixExceptionRecycleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FixExceptionRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setOnTouchListener(OnTouchListener l) {
        super.setOnTouchListener(new FixExceptionOnTouchListener(l));
    }


    static class FixExceptionOnTouchListener implements OnTouchListener {

        private final OnTouchListener proxyedListener;

        public FixExceptionOnTouchListener(OnTouchListener proxyedListener) {
            this.proxyedListener = proxyedListener;
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            try {
                return this.proxyedListener.onTouch(v, event);
            } catch (IllegalArgumentException e) {
                Log.i(LOG_TAG, "IllegalArgumentException catched", e);
            }
            return false;
        }
    }
}

@riki-dexter @hadidez @daniil-pastuhov @DatoAlxanishvili

imlk0 avatar Jun 02 '18 05:06 imlk0