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.
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); } });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With