Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hide FloatingActionButton on scroll of RecyclerView

I want to hide/show FloatingActionButton on scroll of RecyclerView.

My XML layout :

<android.support.design.widget.CoordinatorLayout             android:layout_width="match_parent"             android:layout_height="match_parent" >              <android.support.v7.widget.RecyclerView                 android:id="@+id/recyclerview_eventlist"                 android:layout_width="match_parent"                 android:layout_height="match_parent" />              <android.support.design.widget.FloatingActionButton                 android:id="@+id/fab_createevent"                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:layout_margin="@dimen/fab_margin"                 app:layout_anchor="@id/recyclerview_eventlist"                 app:layout_anchorGravity="bottom|right|end"                 app:layout_behavior="com.eventizon.behavior.ScrollAwareFABBehavior"                 android:src="@drawable/ic_edit"                 app:backgroundTint="@color/custom_color_1"                 app:borderWidth="0dp" />         </android.support.design.widget.CoordinatorLayout> 

DrawerLayout is the parent layout of this layout.

    public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {       private static final String TAG = "ScrollAwareFABBehavior";      public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {         super();         Log.e(TAG,"ScrollAwareFABBehavior");     }      @Override     public void onNestedScroll(CoordinatorLayout coordinatorLayout,             FloatingActionButton child, View target, int dxConsumed,             int dyConsumed, int dxUnconsumed, int dyUnconsumed) {         // TODO Auto-generated method stub         super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed,                 dxUnconsumed, dyUnconsumed);         Log.e(TAG,"onNestedScroll called");         if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {             Log.e(TAG,"child.hide()");             child.hide();         } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {             Log.e(TAG,"child.show()");             child.show();         }     } } 

Used this layout behaviour for FloatingActionButton.

When I see logcat only constructor is getting called. onNestedScroll() doesn't get called when I scroll the list.

like image 285
Pritam Kadam Avatar asked Oct 19 '15 07:10

Pritam Kadam


1 Answers

Easiest solution:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {     @Override     public void onScrolled(RecyclerView recyclerView, int dx, int dy)     {         if (dy > 0 ||dy<0 && fab.isShown())         {             fab.hide();         }     }      @Override     public void onScrollStateChanged(RecyclerView recyclerView, int newState)     {         if (newState == RecyclerView.SCROLL_STATE_IDLE)         {             fab.show();         }          super.onScrollStateChanged(recyclerView, newState);     } }); 
like image 63
Dgotlieb Avatar answered Sep 28 '22 19:09

Dgotlieb