题外问题 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
的异常触发的地方是在哪儿?
042020-03-02 -
Qiujuer
2020-02-24
从日志来看是这里的错误:
at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
估计有点无解。或者向上看看调用传递链。看看最开始是谁触发下来的,可以考虑自定义控件后捕获错误。
你自己就在进行了,只是自定义的控件错了。
00
相似问题