一 、原因
ViewPager2的内部实现是RecyclerView,当手势横向移动的距离大于touchSlop的时候,就会认定你有横向滑动的手势,进而驱动ViewPager2进行左右滑动
二、解决办法
重写内部嵌套的RecyclerView:
public class RecyclerViewInVP2 extends RecyclerView {
public RecyclerViewInVP2(@NonNull Context context) {
super(context);
}
public RecyclerViewInVP2(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public RecyclerViewInVP2(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private int startX, startY;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) ev.getX();
startY = (int) ev.getY();
getParent().requestDisallowInterceptTouchEvent(true);//告诉viewgroup不要去拦截我
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getX();
int endY = (int) ev.getY();
int disX = Math.abs(endX - startX);
int disY = Math.abs(endY - startY);
if (disX > disY) {
getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);//下拉的时候是false
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return super.dispatchTouchEvent(ev);
}
}
从源码层面分析: