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
.
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
.
Odpowiedzi:
NestedScrollView.scrollTo(0, 0);
NestedScrollView.scrollTo(0, 0);
aby przewinąć do góry NestedScrollView
. 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.
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życie fullScroll(direct)
funkcji
nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
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);
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ó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);
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());
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);
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);
Dodaj linię dwa razy. Zadziałało dla mnie
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Zamiast tego użyj View.scollTo (int x, int y), aby przewinąć do góry.
findViewById({your NestedScrollView resource id}).scrollTo(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);
Oto jak przewijam do elementu RecyclerView, gdy RecyclerView znajduje się w NestedScrollView
Najpierw pobierz, a item height
następnie przewiń do tego position
, który chcesz.
val itemHeight =
binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)