Android 使AppBarLayout/CollingToolBarLayout对ViewPager中的RecyclerView中的滚动做出反应

Android 使AppBarLayout/CollingToolBarLayout对ViewPager中的RecyclerView中的滚动做出反应,android,android-fragments,android-recyclerview,android-collapsingtoolbarlayout,Android,Android Fragments,Android Recyclerview,Android Collapsingtoolbarlayout,我制作了一个带有折叠工具栏布局和ViewPager的测试应用程序。ViewPager包含三个片段,其中一个片段只是一个简单的RecyclerView。我的问题是,当RecyclerView滚动时,CollasingToolbarLayout(或者更确切地说AppBarLayout)不会展开/收缩,除非布局未完全展开,RecyclerView位于顶部,而我向下滚动。然后塌陷工具栏布局也在扩展 注意:我已经上传了测试应用程序。 我目前的布局如下: <?xml version="1.0" enc

我制作了一个带有折叠工具栏布局和ViewPager的测试应用程序。ViewPager包含三个片段,其中一个片段只是一个简单的RecyclerView。我的问题是,当RecyclerView滚动时,CollasingToolbarLayout(或者更确切地说AppBarLayout)不会展开/收缩,除非布局未完全展开,RecyclerView位于顶部,而我向下滚动。然后塌陷工具栏布局也在扩展

注意:我已经上传了测试应用程序。

我目前的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="256dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:fitsSystemWindows="true" >

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/mm_recipe_activity_image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/cake"
                android:scaleType="centerCrop"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="pin"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            app:tabMode="fixed"
            app:tabIndicatorHeight="0dp"
            />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>


</android.support.design.widget.CoordinatorLayout>
然后是带有RecyclerView的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/yellow_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/yellow" />

</android.support.v4.widget.NestedScrollView>

从初始位置向上滚动会滚动RecyclerView本身,但不会滚动AppBarLayout/CollingToolBarLayout。我希望此时向上/向下滚动,以正常折叠/展开它们

在第一幅图像中,折叠工具栏布局被折叠,回收视图位于顶部。如果此时向下滚动RecyclerView,我将开始展开CollasingToolbarLayout,这是意料之中的。但是,如果中途停止并向上滚动RecyclerView,我仍然会向上滚动RecyclerView,如第三幅图所示


附加问题:上面第三张图片底部的灰色视图是什么?我看不出我在任何地方添加了它。它也可以在纯文本视图的布局底部看到,因此这不是因为RecyclerView。它是父布局的默认背景色。直到recyclerView/TextView/ViewPager无法覆盖整个屏幕,您才会看到它。将换行内容作为两个元素的高度。试着让他们匹配你的父母并检查结果

这里的问题是,您不应该在NestedScrollView中“嵌套”RecyclerView

为什么?

因为RecycleView本身实现了“NestedScrollingChild”和“ScrollingView”接口。NestedScrollView用于支持没有滚动功能的视图,如在其他情况下成功实现的LinearLayout

实际上,黄色_fragment.xml在更改为:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/yellow_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/yellow"
        android:fillViewport="true"
    />

_vs“假”_

我删除了TextView文本中的一段,以进一步突出差异。查看Romain Guy关于此功能的更多信息


编辑:正如Krøllebølle在评论中提到的,确保拥有最新的支持库版本,因为这可能是在视图中添加
android:fillViewport=“true”
后灰色条纹仍然存在的原因。

您指的是底部的灰色裸条吗?它在布局中也可见,只是一个普通的文本视图,因此(可能)这不是RecyclerLayout的错。不,这没有任何区别。请尝试检查,如果您有包装内容,请将其更改为匹配例如viewpager或包含linearlayout的父级。非常感谢您的详细解释。移除RecyclerView周围的NestedScrollView会产生预期的行为。由于某种原因,我无法解决奖金问题,即使在尝试了Romain Guy在博客文章中解释的内容之后。我还尝试了
match\u parent
wrap\u content
layout\u height=“0dp”
以及
layout\u weight=“1”
的各种组合。我会错过什么?我也在Github上更新了代码。真奇怪,我无法重现你的bug。在我的Kitkat 4.4.2中,我看不到使用更新代码的灰色条纹。检查“android:layout\u gravity=“fill\u vertical””是否有任何帮助!是的,这很奇怪。当用安卓5.1.1模拟Nexus5时,灰色条在那里,但在我运行JellyBean(4.3)的旧GalaxyS3上,一切都正常。其他运行Android 2.3.3和4.4.4的测试模拟器也可以。在运行5.1.1的Xperia Z1 Compact上进行的最终测试显示,它们带有灰色条。因此,似乎存在一些版本控制问题
android:layout\u gravity=“fill\u vertical
似乎对此没有任何帮助。这个问题不会影响我的实际应用程序,但是,就在这次测试中,所以现在修复对我来说并不重要。更新以支持库版本23.2.0为我修复了灰色条的问题。我使用的是23.1.1。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/yellow_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/yellow"
        android:fillViewport="true"
    />