Czy istnieje sposób programowego przewijania do góry a NestedScrollView
przez wyzwalanie zdarzeń przewijania dla elementu nadrzędnego? smoothScrollTo(x, y)
nie deleguje zdarzeń przewijania do NestedScrollingParent
.
android
android-layout
android-nestedscrollview
lukas1994
źródło
źródło
Odpowiedzi:
NestedScrollView.scrollTo(0, 0);
źródło
NestedScrollView.scrollTo(0, 0);
aby przewinąć do góryNestedScrollView
. Zapraszamy.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
10000
jest prędkość w kierunku y.źródło
behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);
aby go odwrócićbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
Innym sposobem płynnego przewijania
NestedScrollView
do końca w górę lub w dół jest użyciefullScroll(direct)
funkcjinestedScrollView.fullScroll(View.FOCUS_DOWN); nestedScrollView.fullScroll(View.FOCUS_UP);
źródło
NestedScrollView
pod paskiem aplikacji?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);
źródło
scrollView.getParent().requestChildFocus(scrollView, scrollView);
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óbappBarLayout1.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);
źródło
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());
źródło
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);
źródło
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);
źródło
Jakiś czas
NestedScrollView.scrollTo(0, 0);
iscrollview.pageScroll(View.FOCUS_UP);
nie działaW tym celu musisz używać
fling()
ismoothScrollTo()
razemPRZYKŁADOWY KOD
nestedScrollView.post { nestedScrollView.fling(0) nestedScrollView.smoothScrollTo(0, 0) }
źródło
Dodaj linię dwa razy. Zadziałało dla mnie
nestedScrollView.fullScroll(View.FOCUS_UP); nestedScrollView.fullScroll(View.FOCUS_UP);
źródło
Zamiast tego użyj View.scollTo (int x, int y), aby przewinąć do góry.
findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
źródło
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);
źródło
Oto jak przewijam do elementu RecyclerView, gdy RecyclerView znajduje się w NestedScrollView
Najpierw pobierz, a
item height
następnie przewiń do tegoposition
, który chcesz.val itemHeight = binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
źródło