86

Is there a way to programmatically scroll to the top of a NestedScrollView by also triggering the scroll events for the parent? smoothScrollTo(x, y) doesn't delegate the scroll events to the NestedScrollingParent.

Abdul Wasae
  • 3,430
  • 2
  • 27
  • 54
lukas1994
  • 1,709
  • 1
  • 12
  • 17
  • Clarify your question more, do you mean to say when the NestedScrollView is inside the coordinator layout? – Pier Betos Jan 08 '16 at 08:05
  • to programmatically scroll to any point, check https://stackoverflow.com/questions/52083678/nestedscrollviews-smoothscrollto-behaves-weird – user1506104 Sep 10 '18 at 17:04

13 Answers13

112
NestedScrollView.scrollTo(0, 0);
SilentKnight
  • 13,063
  • 18
  • 46
  • 76
44

I managed to do it (animated scrolling):

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    behavior.onNestedFling(coordinatorLayout, appBarLayout, null, 0, 10000, true);
}

where 10000 is the velocity in y-direction.

lukas1994
  • 1,709
  • 1
  • 12
  • 17
  • 1
    if you only like to scroll to hide the appbarlayout like in my case you could do `behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);` to reverse it `behavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);` – Kosh Apr 28 '16 at 14:45
  • 3
    Thx. Any idea on how to scroll to the bottom of the nestedscrollview ? – Bibu Jun 08 '16 at 16:04
  • When the AppBarLayout is expanded, simulating the nested fling will collapse it (which is great), but will not make the NestedScrollView scroll down at the same time... – Raphael Royer-Rivard Nov 19 '16 at 20:06
  • Plus, when the AppBarLayout is fully collapsed, using a negative y velocity value will not expand it. – Raphael Royer-Rivard Nov 19 '16 at 21:15
34

Another way to smooth scroll NestedScrollView to all the way up or down is using fullScroll(direct) function

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
Sharj
  • 14,733
  • 12
  • 55
  • 87
22

Nothing worked for me, and I don't really know why this worked, but here is my solution and problem.

When adding recycler view to a nested scroll view, it showed recycler view on screen when getting to that activity. In order to scroll all the way up, I had to use this:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.details_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
ProductDescriptionAdapter adapter = new ProductDescriptionAdapter(this);
adapter.setData(mProduct.getDetails());
recyclerView.setAdapter(adapter);
NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scroll);
scrollView.getParent().requestChildFocus(scrollView, scrollView);
Tunaki
  • 116,530
  • 39
  • 281
  • 370
Vulovic Vukasin
  • 1,610
  • 2
  • 20
  • 28
22

I also faced similar kind scenario. In my case when I scroll down to end, FAB button should be appears and when user tap on that FAB button should go to the top of the page. For that I added @SilentKnight answer NestedScrollView.scrollTo(0, 0); For go to the top but which is not enough for smooth animation for scroll up.
For smooth animation I have used @Sharj answer which is NestedScrollView.fullScroll(View.FOCUS_UP); But then my AppBar is not visible there fore I have to expanded the AppBar as following appBarLayout1.setExpanded(true). So using these three I can able smoothly go to top of the page.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
Vidu
  • 381
  • 4
  • 6
11

You could easily fake the scrolling on NestedScrollView level. You basically tell the coordinatorLayout that you just scrolled by the height of the toolbar.

    NestedScrollView nestedScrollView = (NestedScrollView) getActivity().findViewById(R.id.your_nested_scroll_view);

    int toolbarHeight = getActivity().findViewById(R.id.toolbar).getHeight();

    nestedScrollView.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
    nestedScrollView.dispatchNestedPreScroll(0, toolbarHeight, null, null);
    nestedScrollView.dispatchNestedScroll(0, 0, 0, 0, new int[]{0, -toolbarHeight});
    nestedScrollView.scrollTo(0, nestedScrollView.getBottom());
Zsolt Boldizsár
  • 2,109
  • 2
  • 22
  • 32
user1259201
  • 660
  • 5
  • 18
  • The only answer that worked for me! I needed to scroll up in coordinator layout (so both nestedScrollView and collapsibleToolbar). I used existing code but toolbarHeight changed to Integer.MIN_VALUE and -toolbarHeight to Integer.MAX_VALUE (as I need opposite dirrection). And then I call appBarLayout.setExpanded(true, true); Thank you! – Viktoriia Chebotar Nov 28 '18 at 13:29
10

You can use this for smooth scroll.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);

OR for normal scroll

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
Ali Akram
  • 2,966
  • 1
  • 18
  • 29
8

Some time NestedScrollView.scrollTo(0, 0); and scrollview.pageScroll(View.FOCUS_UP); does not work

At that you need to use fling() and smoothScrollTo() together

SAMPLE CODE

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}
AskNilesh
  • 58,437
  • 15
  • 99
  • 129
7

I tried all the above responses, nothin seemed to work but I only needed a postDelayed.

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);
MontDeska
  • 1,417
  • 18
  • 15
3

Add the line two times .worked for me

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Saljith Kj
  • 95
  • 4
1

Use the View.scollTo(int x, int y) instead to scroll to the top.

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
0

I had problem with NestedScrollView when I used than with RecyclerView . This code worked for me: nestedScrollView!!.getParent().requestChildFocus(nestedScrollView, nestedScrollView);

    val recyclerViewSearch = activity?.findViewById<RecyclerView>(R.id.recycler)
    recyclerViewSearch.setAdapter(setAdapterSearch())

    val nestedScrollView = activity?.findViewById<NestedScrollView>(R.id.bottom_sheet_Search)
    nestedScrollView!!.getParent().requestChildFocus(nestedScrollView, nestedScrollView);
Maryam Azhdari
  • 867
  • 8
  • 8
0

Here is how I scroll to an item of RecyclerView when RecyclerView is inside NestedScrollView

First, get an item height then scroll to the position that you want.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Abdurahman Popal
  • 1,562
  • 16
  • 15