Android 使AppBarLayout/CollingToolBarLayout对ViewPager中的RecyclerView中的滚动做出反应
我制作了一个带有折叠工具栏布局和ViewPager的测试应用程序。ViewPager包含三个片段,其中一个片段只是一个简单的RecyclerView。我的问题是,当RecyclerView滚动时,CollasingToolbarLayout(或者更确切地说AppBarLayout)不会展开/收缩,除非布局未完全展开,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
<?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"
/>