快速滚动后Collapsing Toolbar回弹问题求助:需固定Toolbar与TabLayout
解决Toolbar和TabLayout固定及滚动回弹问题
我看了你的布局代码,问题主要出在TabLayout的位置和CollapsingToolbarLayout的滚动配置上,还有部分视图的嵌套结构导致了滚动回弹。咱们来一步步调整,实现Toolbar和TabLayout固定在顶部,同时解决回弹问题:
核心问题分析
- 原来的TabLayout放在
NestedScrollView内部,滚动时会跟着内容一起移动,无法固定 CollapsingToolbarLayout的scrollFlags包含snap,这会导致滚动到半程时自动回弹,不符合固定需求- 两个横向RecyclerView放在
CollapsingToolbarLayout里,和嵌套滚动视图的行为冲突,加剧了回弹问题
修改后的完整布局代码
<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" android:background="#060C18" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:fitsSystemWindows="true" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/livetv_bg_list" android:fitsSystemWindows="true" app:contentScrim="#060C18" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:titleEnabled="false"> <!-- 顶部滑块区域 --> <RelativeLayout android:id="@+id/banner_relative_layout" android:layout_width="match_parent" android:layout_height="370dp"> <com.newitventure.nettv.nettvapp.ott.utils.AutoScrollViewPager android:id="@+id/movieslider" android:layout_width="match_parent" android:layout_height="match_parent" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="?attr/actionBarSize" android:gravity="right|end" android:paddingRight="10dp"> <me.relex.circleindicator.CircleIndicator android:id="@+id/indicator" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_marginTop="20dp" app:ci_drawable="@drawable/banner_indicator_color" app:ci_drawable_unselected="@drawable/banner_unselected_indicator_color" /> </RelativeLayout> </RelativeLayout> <!-- 固定的Toolbar --> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"> <ImageView android:id="@+id/ham_menu" android:layout_width="24dp" android:layout_height="24dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:src="@drawable/menu" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> <!-- 固定在Toolbar下方的TabLayout --> <android.support.design.widget.TabLayout android:id="@+id/movie_categories" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#060C18" app:tabGravity="center" app:tabIndicatorColor="#ff7b52" app:tabIndicatorHeight="4dp" app:tabMode="scrollable" app:tabSelectedTextColor="#DDDDDD" app:tabTextColor="#9095A0" /> </android.support.design.widget.AppBarLayout> <!-- 可滚动的内容区域 --> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 两个横向RecyclerView移到这里,随内容滚动 --> <LinearLayout android:id="@+id/main_linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#060C18" android:orientation="vertical" android:visibility="visible"> <RelativeLayout android:id="@+id/recently_added_relative_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="16dp" android:layout_marginTop="16dp" android:visibility="gone"> <TextView android:id="@+id/recently_added_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RECENTLY ADDED" android:textColor="#fff" /> <android.support.v7.widget.RecyclerView android:id="@+id/movie_recently_added_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/recently_added_tv" android:layout_marginTop="8dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SEE MORE" android:textColor="#ff7b52" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#ff7b52" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:id="@+id/continue_watching_relative_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="16dp" android:visibility="visible"> <TextView android:id="@+id/continue_watching_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CONTINUE WATCHING" android:textColor="#fff" /> <android.support.v7.widget.RecyclerView android:id="@+id/movie_continue_watching_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/continue_watching_tv" android:layout_marginTop="8dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SEE MORE" android:textColor="#ff7b52" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#ff7b52" /> </LinearLayout> </RelativeLayout> </LinearLayout> <!-- 分类内容ViewPager --> <android.support.v4.view.ViewPager android:id="@+id/movie_categories_detail_list" android:layout_width="match_parent" android:layout_height="500dp" android:layout_marginTop="8dp" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> <Button android:id="@+id/movie_categories_view_all" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="View All" android:visibility="gone" /> <ProgressBar android:id="@+id/movie_progress" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:visibility="visible" /> <com.newitventure.nettv.nettvapp.search.MeroListView android:id="@+id/search_listview" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="50dp" android:background="@drawable/list_view_bg" android:divider="@null" android:visibility="gone" /> </android.support.design.widget.CoordinatorLayout>
关键改动说明
- TabLayout移到AppBarLayout内:把TabLayout放在
CollapsingToolbarLayout外面、AppBarLayout里面,这样滑块区域折叠后,TabLayout会固定在Toolbar下方,不会随内容滚动。 - 修改CollapsingToolbarLayout的scrollFlags:移除
snap属性,只保留scroll|exitUntilCollapsed,确保滑块区域完全折叠后固定Toolbar,避免半程回弹。 - 调整横向RecyclerView的位置:将两个RecyclerView移到
NestedScrollView中,让它们随内容滚动,避免和CollapsingToolbarLayout的滚动行为冲突。 - 移除RecyclerView的app:layout_behavior:RecyclerView现在在NestedScrollView内部,不需要该behavior,否则会导致滚动异常。
这样调整后,就能实现Toolbar和TabLayout固定在顶部,快速上滑时也不会出现回弹问题了。
内容的提问来源于stack exchange,提问作者Kabindra Shrestha
相关产品推荐
相关产品推荐

