Programowo przewiń do góry NestedScrollView


82

Czy istnieje sposób programowego przewijania do góry a NestedScrollViewprzez wyzwalanie zdarzeń przewijania dla elementu nadrzędnego? smoothScrollTo(x, y)nie deleguje zdarzeń przewijania do NestedScrollingParent.


Wyjaśnij bardziej swoje pytanie, czy chcesz powiedzieć, że NestedScrollView znajduje się w układzie koordynatora?
— Pier Betos

aby programowo przewijać do dowolnego punktu, sprawdź stackoverflow.com/questions/52083678/ ...
— user1506104

Odpowiedzi:


106
NestedScrollView.scrollTo(0, 0);

7
Mówię, aby użyć, NestedScrollView.scrollTo(0, 0);aby przewinąć do góry NestedScrollView. Zapraszamy.
— SilentKnight,

Jest to bardziej ogólnie stosowane do ScrollView lub NestedScrollView.
— Robert

42

Udało mi się to zrobić (przewijanie animowane):

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);
}

gdzie 10000jest prędkość w kierunku y.


1
jeśli chcesz tylko przewijać, aby ukryć appbarlayout, tak jak w moim przypadku, możesz zrobić, behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);aby go odwrócićbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
— k0sh

3
Dzięki. Masz pomysł, jak przewinąć do dołu zagnieżdżonego widoku przewijania?
— Bibu

Kiedy AppBarLayout zostanie rozwinięty, symulacja zagnieżdżonego rzutu spowoduje jego zwinięcie (co jest świetne), ale nie spowoduje, że NestedScrollView przewinie się w dół w tym samym czasie ...
— Raphael Royer-Rivard

Ponadto, gdy AppBarLayout jest całkowicie zwinięty, użycie ujemnej wartości prędkości y nie spowoduje jego rozwinięcia.
— Raphael Royer-Rivard

33

Innym sposobem płynnego przewijania NestedScrollViewdo końca w górę lub w dół jest użycie fullScroll(direct)funkcji

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);

fullScroll (View.FOCUS_UP) ukryty pasek aplikacji nie wychodzi. Dowolny pomysł
— Shabbir Dhangot

@Sabbir Dhangot Czy umieściłeś swój NestedScrollViewpod paskiem aplikacji?
— MeLine,

Mam jedno pytanie, widzę, że fullScroll otrzymuje widok. jeśli chcę przewinąć do określonego widoku tekstowego, editext lub recyklingu, czy przewinie on do niego?
— Felipe Franco,

22

Nic nie działało dla mnie i tak naprawdę nie wiem, dlaczego to zadziałało, ale oto moje rozwiązanie i problem.

Dodając widok recyklera do zagnieżdżonego widoku przewijania, pokazywał widok recyklera na ekranie po przejściu do tego działania. Aby przewinąć do samego końca, musiałem użyć tego:

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);

5
Wooooow, to jest najlepsze, damet Garm
— abbasalim

11
Jeśli ktoś ma problem z tym, że widok recyklingu wewnątrz zagnieżdżonego widoku przewijania jest już przewijany do połowy podczas wchodzenia do działania, spróbuj ustawić najwyższy element w katalogu głównym XML, aby miał następującą właściwość android: focusableInTouchMode = "true"
— user1025013

1
To rozwiązanie działa doskonale tam, gdzie jako scrollView.scrollTo (0,0); w ogóle nie działa.
— taranjeetsapra

4
To zadziałało:scrollView.getParent().requestChildFocus(scrollView, scrollView);
— Rajeev Sahu

1
Działał jak urok. Dzięki
— Vinoth ios

21

Miałem też podobny scenariusz. W moim przypadku, gdy przewijam w dół do końca, powinien pojawić się przycisk FAB, a gdy użytkownik naciśnie ten przycisk FAB, powinien przejść na górę strony. W tym celu dodałem odpowiedź @SilentKnight NestedScrollView.scrollTo(0, 0);For idź na górę, ale to nie wystarczy do płynnej animacji przewijania w górę.
Aby uzyskać płynną animację, użyłem odpowiedzi @Sharj, która brzmi NestedScrollView.fullScroll(View.FOCUS_UP); Ale wtedy mój AppBar nie jest widoczny, dlatego muszę rozwinąć AppBar w następujący sposób appBarLayout1.setExpanded(true). Korzystając z tych trzech, mogę płynnie przejść na górę strony.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);

5
appBarLayout1.setExpanded (true); - pracował dla mnie! Dzięki :)
— Andrei

Dziękuję Ci! To jest najbardziej poprawna odpowiedź, szczególnie gdy używasz appbarlayout
— demogorgorn

11

Możesz łatwo sfałszować przewijanie na poziomie NestedScrollView. Zasadniczo mówisz koordynatorowi Layout, że właśnie przewinąłeś o wysokość paska narzędzi.

    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());

Jedyna odpowiedź, która mi pomogła! Musiałem przewinąć w górę w układzie koordynatora (więc zarówno nestedScrollView, jak i collapsibleToolbar). Użyłem istniejącego kodu, ale zmieniono toolbarHeight na Integer.MIN_VALUE i -toolbarHeight na Integer.MAX_VALUE (ponieważ potrzebuję odwrotnej zmiany kierunku). A potem wywołuję appBarLayout.setExpanded (true, true); Dziękuję Ci!
— Viktoriia Chebotar

9

Możesz użyć tego do płynnego przewijania.

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

LUB dla normalnego przewijania

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

Gr8 praca. Oszczędzasz mój czas
— Priyanka G

7

Wypróbowałem wszystkie powyższe odpowiedzi, nic nie wydawało się działać, ale potrzebowałem tylko postu z opóźnieniem.

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

6

Jakiś czas NestedScrollView.scrollTo(0, 0);i scrollview.pageScroll(View.FOCUS_UP);nie działa

W tym celu musisz używać fling()i smoothScrollTo()razem

PRZYKŁADOWY KOD

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}

2

Dodaj linię dwa razy. Zadziałało dla mnie

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);

1

Zamiast tego użyj View.scollTo (int x, int y), aby przewinąć do góry.

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

0

Miałem problem z NestedScrollView, gdy używałem niż z RecyclerView. Ten kod zadziałał dla mnie: 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);

0

Oto jak przewijam do elementu RecyclerView, gdy RecyclerView znajduje się w NestedScrollView

Najpierw pobierz, a item heightnastępnie przewiń do tego position, który chcesz.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.