我有一个 RecyclerView(称为rootRecyclerView
),它可以根据某些API响应具有不同类型的行。其中一个行是使用水平ViewPager2
实现的,另一个行是使用水平的RecyclerView
实现的(称为childRecyclerView
)。
rootRecyclerView
在垂直方向上滑动,而viewPager2
和childRecyclerView
在水平方向上滑动。
问题:
当我在屏幕上滑动时,如果滑动位于viewPager2
或childRecyclerView
上,则滑动必须完全水平直行。否则,它们将无法水平滚动;滑动被rootRecyclerView
捕获,因此您会看到垂直移动。
这种情况发生的原因是因为您的拇指会呈圆形/曲线状移动,同时在X和Y轴上产生运动,因此rootRecyclerView
拦截了滑动,从而创建了这种令人不愉快的用户体验。
我尝试解决这个问题,例如向childRecyclerView
添加OnItemTouchListener
,如下所示:
private float Y_BUFFER = ViewConfiguration.get(getContext())
.getScaledPagingTouchSlop(); // 10;
private float preX = 0f;
private float preY = 0f;
childRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
if(e.getAction()==MotionEvent.ACTION_DOWN){
childRecyclerView.getParent().requestDisallowInterceptTouchEvent(true);
}
if(e.getAction() == MotionEvent.ACTION_MOVE){
if (Math.abs(e.getX() - preX) > Math.abs(e.getY() - preY)) {
childRecyclerView.getParent().requestDisallowInterceptTouchEvent(true);
} else if (Math.abs(e.getY() - preY) > Y_BUFFER) {
childRecyclerView.getParent().requestDisallowInterceptTouchEvent(false);
}
}
preX = e.getX();
preY = e.getY();
return false;
}
// ... rest of the code
它仅解决了
childRecyclerView
的问题,但我无法解决ViewPager2
的问题。我也尝试过像答案链接中描述的使用
GestureDetector
和其他代码组合,但我无法使其正常工作。有人可以帮我吗?
Y_BUFFER
硬编码为 10 个像素。我建议您使用预先缩放的值,例如ViewConfiguration.get(getContext()).getScaledPagingTouchSlop()
。 - Miha_x64