题外问题 ViewPager2+Fragment+RecyclerView 多点触控的问题

来源:6-13 客户端注册功能实现-2

慕运维0435267

2020-02-22

项目中使用 ViewPager2+Fragment+RecyclerView 双手同时点击会奔溃
java.lang.IllegalArgumentException: pointerIndex out of range pointerIndex=-1 pointerCount=1
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2213)
at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2522)
老师你好,我是为了解决ReyclerView与ViewPager2滑动冲突,自定义RecyclerView拦截了事件,
MotionEvent.ACTION_MOVE 中在recyclerView滑动完成时将事件交给ViewPager2
getParent().requestDisallowInterceptTouchEvent(canScrollVertically(startY - endY));
这样可以实现在recyclerView滑动到底部时直接滑动到ViewPager2的下一页,但是这样我用双手很快点击时
就会报错pointerIndex out of range,你有什么好办法吗?
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) ev.getX(0);
startY = (int) ev.getY(0);
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:

            int endX = (int) ev.getX(0);
            int endY = (int) ev.getY(0);
            int disX = Math.abs(endX - startX);
            int disY = Math.abs(endY - startY);
            if (disX > disY) {
                getParent().requestDisallowInterceptTouchEvent(canScrollHorizontally(startX - endX));
            } else {
                getParent().requestDisallowInterceptTouchEvent(canScrollVertically(startY - endY));
            }

            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            getParent().requestDisallowInterceptTouchEvent(false);
            break;
    }
    return super.dispatchTouchEvent(ev);
}
写回答

2回答

Qiujuer

2020-02-24

pointerIndex out of range 

的异常触发的地方是在哪儿?

0
4
Qiujuer
回复
慕运维0435267
抱歉这几天忙着忘记回复你了。这个你给我截图一下错误的日志,直接截图即可。
2020-03-02
共4条回复

Qiujuer

2020-02-24

从日志来看是这里的错误:

at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)

估计有点无解。或者向上看看调用传递链。看看最开始是谁触发下来的,可以考虑自定义控件后捕获错误。

你自己就在进行了,只是自定义的控件错了。

0
0

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1749 学习 · 872 问题

查看课程