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.

lukas1994
źródło
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);
SilentKnight
źródło
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.

lukas1994
źródło
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);
Sharj
źródło
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);
Vulovic Vukasin
źródło
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);
Vidu
źródło
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());
user1259201
źródło
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);
Ali Akram
źródło
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);
MontDeska
źródło
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)
}
AskNilesh
źródło
2

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

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Saljith Kj
źródło
1

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

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
Sokdara Cheng
źródło
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);
Maryam Azhdari
źródło
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)
Abdurahman Popal
źródło