【问题标题】:Android collapsing toolbar with RecyclerViewAndroid 使用 RecyclerView 折叠工具栏
【发布时间】:2023-03-15 11:34:01
【问题描述】:

我正在尝试将折叠工具栏与RecyclerView 结合使用,我可以找到的大多数折叠工具栏示例通常带有静态滚动视图,而我发现的少数带有RecyclerView 的示例不起作用,有没有人能够完成这项工作?我将在下面包含我的 xml 代码:

<?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/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

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

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                app:layout_collapseMode="none"/>

            <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>

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

【问题讨论】:

  • 您使用哪个版本的com.android.support:recyclerview-v7
  • 我正在使用 com.android.support:recyclerview-v7:24.0.0
  • 请在下方查看我的答案

标签: android android-recyclerview android-coordinatorlayout android-collapsingtoolbarlayout


【解决方案1】:

终于修好了thanks to this library

<?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.support.v7.widget.RecyclerView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/app_bar_height">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/backdrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/cover"
            android:visibility="visible"
            app:layout_collapseMode="none" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:navigationIcon="@drawable/ic_menu_arrow_back" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

【讨论】:

    【解决方案2】:

    你只需要这样做:

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                app:contentScrim="?attr/colorPrimary">
    
                <ImageView
                    android:id="@+id/image"
                    android:layout_width="match_parent"
                    android:layout_height="350dp"
                    android:scaleType="centerCrop"
                    app:layout_collapseMode="parallax"
                    app:srcCompat="?android:attr/fingerprintAuthDrawable" />
    
                <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>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    【讨论】:

    • 将重力和锚点添加到 recyclerview 并没有为我解决这个问题,你能让它工作吗?
    • @JCDecary 你不应该需要layout_anchorlayout_anchorGravity;如果你从你的 xml 中删除两者,它的行为应该是相同的。
    • 你是否也在使用'com.android.support:recyclerview-v7:24.0.0'
    • 没有@EdmundRojas 我正在使用:编译'com.android.support:recyclerview-v7:24.2.1'
    【解决方案3】:

    您已重新排序 CollapsingToolbarLayoutRecyclerView。正如您可能从文档中看到的,CoordinatorLayout 是一个超级强大的 FrameLayout。这意味着第二个添加到布局中的元素将位于第一个添加的元素之上。

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/main_content"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="500dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:contentScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <ImageView
                    android:id="@+id/backdrop"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    app:layout_collapseMode="none"/>
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    </android.support.design.widget.CoordinatorLayout>
    

    【讨论】:

    • 更改订单并没有解决我的问题,你能解决这个问题吗?
    【解决方案4】:

    我相信您的代码不起作用,因为您将 ImageView 上的 layout_collapseMode 设置为 none。根据documentation,这将使视图不可折叠:

    视图将正常运行,没有折叠行为。

    您应该将其设置为layout_collapseMode="parallax" 以获得折叠行为。如果你想在没有视差效果的情况下实现折叠行为,那么你也应该在你的ImageView 上将layout_collapseParallaxMultiplier 设置为0.0


    这是我用来测试它的 XML:

    <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.support.design.widget.AppBarLayout android:id="@+id/app_bar"
            android:layout_width="match_parent" android:layout_height="500dp"
            android:theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent" android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <ImageView
                    android:layout_width="match_parent" android:layout_height="wrap_content"
                    android:scaleType="centerCrop" android:src="@drawable/car"
                    app:layout_collapseMode="parallax"/>
    
                <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
                    android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
                    app:popupTheme="@style/AppTheme.PopupOverlay"/>
    
            </android.support.design.widget.CollapsingToolbarLayout>
    
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v7.widget.RecyclerView android:id="@+id/recycler"
            android:layout_width="match_parent" android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    【讨论】:

    • 不幸的是,问题不在于图像动画,而是 recyclerview 和图像不相互协调并且一个重叠,我无法获得 recyclerview 和的基本滚动行为图像协同工作
    • @EdmundRojas 奇怪,app:layout_behavior="@string/appbar_scrolling_view_behavior" 属性是协调两者的原因。可能尝试我的建议以及按照@VolodymyrKhodonovych 的建议交换订单?
    • @EdmundRojas 我唯一的其他建议可能是将您的RecyclerView 包装在另一个View 中,例如NestedScrollView(确保外部View 具有layout_behavior 属性) ?我自己没有测试过单个RecyclerView,在折叠工具栏的每个实例中,我都有RecyclerViewFragment 内。
    • 我能够在之前没有 recyclerview 的示例中使用 nestedscrollview,添加 recyclerview 它会立即中断
    • @EdmundRojas 我刚刚用虚拟内容做了一个简单的测试,我将发布我上面使用的 XML。 RecyclerViewCollapsingToolbarLayout 正在按预期工作。实际上它甚至可以与layout_collapseMode="none" 一起使用,我认为它不应该,但是哦,好吧。我正在使用recyclerview-v7:24.2.1 在 API 24 (7.0 Nougat) 上运行它。也许只需要来自24.0.0 的更新?
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多