【问题标题】:Outer Recyclerview not receiving scroll events of inner Recyclerview外部 Recyclerview 未收到内部 Recyclerview 的滚动事件
【发布时间】:2015-11-24 07:06:39
【问题描述】:

我按照本教程实现了滚动时隐藏工具栏和 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确实滚动并且具有显示/隐藏工具栏和FAB的行为。

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

我有一种感觉,这是因为内部recyclerview已经拦截了滚动,而外部recyclerview没有得到滚动事件来激活行为。

有谁知道如何确保外部 recyclerview 也获得滚动事件,以便行为起作用?

【问题讨论】:

    标签: android android-recyclerview android-toolbar floating-action-button


    【解决方案1】:

    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,这将激活应用程序滚动行为。

    【讨论】:

    • 正是我需要的。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 我不认为这会起作用,因为目前我正在尝试将滚动事件传递给父级,并且我成功了,因为外部回收器视图正在滚动。但是,内部 recyclerview 没有激活滚动行为来隐藏或显示工具栏/FAB。
    • 谢谢 - 这实际上让我得到了我在下面发布的正确答案。
    【解决方案3】:

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

    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    

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

    【讨论】:

    • 我不确定这是否可行,因为如果您看到演示,我有一个带有标签的活动,其中每个标签都显示一个片段。 CoordinatorLayout 在活动布局 xml 中,而不是在片段布局 xml 中,因此这就是活动中的 viewpager 具有与之关联的 app:layout_behavior 的原因。在包含外部 recyclerview 和内部 recyclerview 布局 xml 的片段布局 xml 中,没有 coordinatorlayout,所以我认为在其中放置一个行为不会有任何影响。
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多