【发布时间】:2020-06-04 09:14:45
【问题描述】:
我有一个 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,如answer link 中所述,以及其他一些代码组合,但我无法使其工作。
谁能帮帮我?
【问题讨论】:
-
请注意,您的
Y_BUFFER被硬编码为 10 个像素。我建议您使用像ViewConfiguration.get(getContext()).getScaledPagingTouchSlop()这样的预烘焙缩放值 -
感谢您的建议。我以前不知道。我已经更新了代码。
标签: java android kotlin android-recyclerview android-viewpager2