在含RecyclerView与CollapsingToolbar的布局中固定底部按钮的最优方案
如何在RecyclerView滚动时固定底部按钮?
我明白你想要实现的效果:RecyclerView滚动时底部按钮保持固定,不用跟着内容上下跑。你之前尝试用监听AppBar偏移来调整按钮边距,虽然能工作,但快速滚动时会跟不上,确实不够可靠。其实根本不用这么麻烦,利用CoordinatorLayout的布局特性就能轻松搞定。
先看看你原来的问题所在:你把按钮放在了带有app:layout_behavior="@string/appbar_scrolling_view_behavior"的RelativeLayout里,这个容器本身是会跟着AppBar的滚动而移动的,所以你再怎么调边距,本质上还是在一个滚动的容器里折腾,自然会有延迟。
最优解决方案:调整布局结构
直接把底部按钮从那个滚动的RelativeLayout里拿出来,作为CoordinatorLayout的直接子View,让它独立于滚动内容之外,这样不管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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".AddProduct"> <android.support.design.widget.AppBarLayout android:id="@+id/product_app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/main.collapsing" android:layout_width="match_parent" android:layout_height="wrap_content" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll|enterAlwaysCollapsed"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="16dp" android:orientation="vertical"> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:text="teste" android:textColor="#161616" android:textSize="22sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <!-- 这个RelativeLayout只负责承载RecyclerView,跟随AppBar滚动 --> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_test" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="100dp" /> <!-- 这里给RecyclerView加底部padding,避免内容被按钮遮挡 --> </RelativeLayout> <!-- 底部按钮直接作为CoordinatorLayout的子View,固定在底部 --> <Button android:id="@+id/btn_product_add_product" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginBottom="24dp" <!-- 根据需要调整边距,避开导航栏 --> android:background="@color/colorPrimary" android:text="Test button" android:textColor="@color/textColorPrimary" /> </android.support.design.widget.CoordinatorLayout>
关键改动说明:
- 按钮独立放置:把Button从滚动容器中移出,作为CoordinatorLayout的直接子View,设置
android:layout_gravity="bottom"让它固定在屏幕底部。 - RecyclerView加底部内边距:给RecyclerView设置
android:paddingBottom,确保最后一项内容不会被底部按钮挡住,值可以根据按钮的高度+边距来调整。 - 移除冗余Behavior:RecyclerView不需要再设置
app:layout_behavior,因为它的父容器已经有这个Behavior了,会跟着AppBar滚动。
这种方式完全不需要写Java/Kotlin代码监听滚动,利用布局本身的特性实现,性能更好,也不会有快速滚动时的延迟问题,是最可靠的实现方式。
内容的提问来源于stack exchange,提问作者user2632190
相关产品推荐
相关产品推荐

