Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Don't collapse Toolbar when RecyclerView fits the screen


I've made an app using Android Design Library, with a Toolbar and TabLayout.
Actually 2 tabs are present, both with 2 RecyclerView, that automatically collapse the Toolbar when scrolled.

My question is: can I disable Toolbar collapsing when RecyclerView has few items and completely fits the screen (like in TAB 2)?

I've seen a lot of examples like CheeseSquare, made by a Google employee where the issue is still present: even if the RecyclerView has just 1 item, the toolbar keeps hiding on scroll.

enter image description here

I think I can just find out if the first item of the RecyclerView is visible on screen and if yes disable toolbar collapsing. The former is easy to implement, what about the latter?

This is my layout:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:id="@+id/coordinator_layout"     android:layout_width="match_parent"     android:layout_height="match_parent">          <android.support.design.widget.AppBarLayout             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:fitsSystemWindows="true"             android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">          <android.support.v7.widget.Toolbar             android:id="@+id/toolbar"             android:layout_width="match_parent"             android:layout_height="wrap_content"             app:layout_scrollFlags="scroll|enterAlwaysCollapsed"             android:background="?attr/colorPrimary"             app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"             app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>          <android.support.design.widget.TabLayout             android:id="@+id/tab_layout"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:background="@color/glucosio_pink"             app:tabSelectedTextColor="@android:color/white"             app:tabIndicatorColor="@color/glucosio_accent"             app:tabTextColor="#80ffffff"/>         </android.support.design.widget.AppBarLayout>          <android.support.v4.view.ViewPager             android:id="@+id/pager"             app:layout_behavior="@string/appbar_scrolling_view_behavior"             android:layout_width="match_parent"             android:layout_height="wrap_content"/>      <android.support.design.widget.FloatingActionButton         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/main_fab"         android:layout_margin="16dp"         android:onClick="onFabClicked"         app:backgroundTint="@color/glucosio_accent"         android:src="@drawable/ic_add_black_24dp"         android:layout_gravity="bottom|right"         />     </android.support.design.widget.CoordinatorLayout> 




like image 222
Paolo Rotolo Avatar asked Sep 04 '15 19:09

Paolo Rotolo


2 Answers

Final Solution (thanks Michał Z.)

Methods to turn off/on Toolbar scrolling:

public void turnOffToolbarScrolling() {     Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);     AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout);      //turn off scrolling     AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) mToolbar.getLayoutParams();     toolbarLayoutParams.setScrollFlags(0);     mToolbar.setLayoutParams(toolbarLayoutParams);      CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();     appBarLayoutParams.setBehavior(null);     appBarLayout.setLayoutParams(appBarLayoutParams); }  public void turnOnToolbarScrolling() {     Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);     AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout);      //turn on scrolling     AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) mToolbar.getLayoutParams();     toolbarLayoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);     mToolbar.setLayoutParams(toolbarLayoutParams);      CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();     appBarLayoutParams.setBehavior(new AppBarLayout.Behavior());     appBarLayout.setLayoutParams(appBarLayoutParams); } 


Find out if last item of RecyclerView is visible in my Fragment.
If yes, disable scrolling:

public void updateToolbarBehaviour(){     if (mLayoutManager.findLastCompletelyVisibleItemPosition() == items.size()-1) {         ((MainActivity) getActivity()).turnOffToolbarScrolling();     } else {         ((MainActivity)getActivity()).turnOnToolbarScrolling();     } } 
like image 108
Paolo Rotolo Avatar answered Oct 05 '22 16:10

Paolo Rotolo


RecyclerView now (since version 23.2) supports wrap_content. Just use wrap_content as the height.

like image 20
Eric Cochran Avatar answered Oct 05 '22 18:10

Eric Cochran