外部 Recyclerview 未收到内部 Recyclerview 的滚动事件

Outer Recyclerview not receiving scroll events of inner Recyclerview

我按照本教程实现了滚动时隐藏工具栏和 FAB 的行为:https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/

我在下面粘贴了该行为的演示。

现在,我已经对其进行了编码,以便它们包含图片 (ImageView) 并在其下方显示项目列表的 recyclerview,而不是选项卡中 recyclerview 中的那些单独项目。

因此,有一个包含内部回收视图列表的外部回收视图。

内部 recyclerview 不滚动 - 我通过重写方法 canScrollVertically() 遵循此线程中的答案禁用了它:Disable Scrolling in child Recyclerview android。我也试过启用内部回收视图的滚动,但我遇到了同样的问题。

外部 Recyclerview 确实滚动并且具有 shows/hides 工具栏和 FAB 的行为。

当我通过按住图片 (ImageView) 进行滚动时,应用程序的行为非常好,显示和隐藏工具栏和 FAB。但是,当我将手指放在内部 recyclerview 上滚动时,外部 recyclerview 滚动并且列表上下移动,但是 show/hiding 工具栏和 FAB 的行为永远不会被激活。

感觉是内层recyclerview拦截了scroll,外层recyclerview没有获取到scroll事件激活行为。

有谁知道如何确保外部 recyclerview 也获得滚动事件以便该行为有效?

您是否尝试过在内部 recyclerview 的 xml 中使用以下内容?

app:layout_behavior="@string/appbar_scrolling_view_behavior"

编辑:假设您使用的是 CoordinatorLayout。

如果你想把一个垂直回收器放在另一个垂直上,你必须为子回收器视图设置固定高度,或者尝试覆盖这个方法

@Override
public boolean dispatchTouchEvent(MotionEvent ev){
    //false - block scrolling of parent recycler and allow scrolling for child
    return false;
}

Hank Moody 的评论实际上让我找到了正确答案 - 谢谢 Hank!

这就是我解决问题的方法:

  1. 创建一个 'Scroll Through' recyclerview,父级将通过这样做接收子级的所有滚动事件:

    public class ScrollThroughRecyclerView extends RecyclerView {
        public ScrollThroughRecyclerView(Context context) {
            super(context);
        }
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev){
            //true - block scrolling of child and allow scrolling for parent recycler
            return true;
        }
    }
    
  2. 在您的 xml 或 java 代码中使用此自定义 recyclerview,滚动事件将正确传递给您的父 recyclerview,这将激活应用程序的滚动行为。