外部Recyclerview没有收到内部Recyclerview的滚动事件

时间:2015-08-29 21:58:57

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

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

我已粘贴了下面的行为示例。

scrolling with fab

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

因此,外部回收者视图包含内部回收者视图列表。

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

外部的recyclerview会滚动并具有显示/隐藏工具栏和FAB的行为。

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

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

有没有人知道如何确保外部的recyclerview也获得滚动事件,以便行为有效?

3 个答案:

答案 0 :(得分:7)

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

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

  1. 创建'滚动浏览' recyclelerview,其中父母将通过这样做接收孩子的所有滚动事件:

    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代码中使用此自定义recyclelerview,滚动事件将正确传递到您的父回收站视图,这将激活应用滚动行为。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

您是否尝试在内部回收站视图的xml中使用以下内容?

app:layout_behavior="@string/appbar_scrolling_view_behavior"

编辑:假设您正在使用CoordinatorLayout。