我必须在另一个RecyclerView(父)的ViewHolder中使用RecyclerView(嵌套)。 嵌套和父都有固定的高度。 嵌套位于父级的底部。
如果我将父与LinearLayoutManager.VERTICAL一起使用,嵌套与LinearLayoutManager.HORIZONTAL一起使用,一切都按预期工作,但如果两个RecyclerView具有相同的方向< strong>嵌套无法听到移动事件 - 因此无法滚动。
在这种情况下我该怎么办?如何让两个RecyclerViews水平滚动,并能够将嵌套与父分开滚动?
谢谢!
答案 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上的任何交互。
希望这可以帮助其他有类似问题的人。