I have AppBarLayout and BottomNavigationView that both collapse during scroll.
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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=".presentation.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:menu="@menu/activity_main_menu"
app:title="@string/home"
app:subtitle="@string/assets"
app:titleCentered="true"
app:subtitleCentered="true"/>
</com.google.android.material.appbar.AppBarLayout>
// NestedScrollView or RecyclerView
<include layout="@layout/content_main" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:menu="@menu/bottom_navigation_menu"
app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Calling smoothScrollToPosition(0) and smoothScrollTo(0, 0) to programmatically scroll RecyclerView and NestedScrollView does not trigger the CoordinatorLayout Behavior for AppBarLayout and BottomNavigationView.
For RecyclerView,we can call startNestedScroll to trigger the coordinate behavior like this.
rv.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL, ViewCompat.TYPE_NON_TOUCH)
rv.smoothScrollToPosition(0)
We trigger it every time back press is called.
if (recyclerView.canScrollUp()) {
recyclerView.smoothScrollUpWithCoordinator()
} else {
super.onBackPressed()
}
However there is a subtle bug here as sometimes it does not scroll all the way up, if you just slightly scroll the list and the AppBarLayout and BottomNavigationView collapse, calling the above code will scroll only up to most second item based on my checking.
For NestedScrollView startNestedScroll does not work at all.
I don't like the idea of manually expanding AppBarLayout and BottomNavigationView.
How to scroll programmatically where it will trigger views' CoordinatorLayout Behavior?