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.