如何在与父级RecyclerView具有相同的滚动方向时启用嵌套的Recyclerview滚动

时间:2016-01-21 22:28:00

标签: android android-recyclerview

我必须在另一个RecyclerView()的ViewHolder中使用RecyclerView(嵌套)。 嵌套都有固定的高度。 嵌套位于父级的底部。

如果我将与LinearLayoutManager.VERTICAL一起使用,嵌套与LinearLayoutManager.HORIZONTAL一起使用,一切都按预期工作,但如果两个RecyclerView具有相同的方向< strong>嵌套无法听到移动事件 - 因此无法滚动。

在这种情况下我该怎么办?如何让两个RecyclerViews水平滚动,并能够将嵌套分开滚动?

谢谢!

1 个答案:

答案 0 :(得分:2)

在我的情况下,我在的底部有嵌套我使用了自定义的RecyclerView.OnItemTouchListener和自定义的LinearLayoutManager,它们都添加到<强>父

在LinearLayoutManager中,我创建了一个启用和禁用滚动的方法。

@Override
public boolean canScrollVertically() {
    return isScrollEnabled && super.canScrollVertically();
}

@Override
public boolean canScrollHorizontally() {
    return isScrollEnabled && super.canScrollHorizontally();
}

public void setScrollEnabled(boolean isScrollEnabled) {
    this.isScrollEnabled = isScrollEnabled;
}

在自定义的RecyclerView.OnItemTouchListener上,我开始检查用户触摸的区域,并禁用/启用父级的滚动功能。

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    if (e.getY() > (viewHolderHeight - nestedRecyclerViewHeight)) {
        mLayoutManager.setScrollEnabled(false);
    } else {
        mLayoutManager.setScrollEnabled(true);
    }

    return false;
}

这是做什么的:每当用户触摸的项目时,系统会调用onInterceptTouchEvent,如果用户触摸嵌套应该是的区域,则禁用父级的滚动。如果触摸发生在嵌套区域之外,它会使其恢复。

我搜索了很多内容以达到这个答案,实际上混合了一些使用Custom LinearLayoutManager来禁用recyclelerview滚动的答案,以及RecyclerView.OnItemTouchListener用于禁用RecyclerView上的任何交互。

希望这可以帮助其他有类似问题的人。