Existe-t-il un moyen de faire défiler par programme jusqu'en haut d'une NestedScrollView
en déclenchant également les événements de défilement pour le parent? smoothScrollTo(x, y)
ne pas déléguer les événements de défilement à la NestedScrollingParent
.
J'ai réussi à le faire (défilement animé):
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);
}
où 10000
est la vitesse dans la direction y.
NestedScrollView.scrollTo(0, 0);
Utiliser la fonction fullScroll(direct)
est un autre moyen d’aplanir le défilement NestedScrollView
jusqu’à tout en haut ou en bas
nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
Rien n'a fonctionné pour moi, et je ne sais pas vraiment pourquoi cela a fonctionné, mais voici ma solution et mon problème.
Lors de l'ajout de la vue recycleur à une vue de défilement imbriquée, la vue recycleur s'affichait à l'écran lors de la réalisation de cette activité. Afin de faire défiler l'écran jusqu'en haut, je devais utiliser ceci:
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);
J'ai aussi fait face à un scénario similaire. Dans mon cas, lorsque je fais défiler l'écran jusqu'à la fin, le bouton FAB doit apparaître et lorsque l'utilisateur appuie sur ce bouton FAB, il devrait aller en haut de la page . Pour cela, j'ai ajouté @SilentKnight answer NestedScrollView.scrollTo(0, 0);
. n'est pas suffisant pour une animation fluide pour un défilement vers le haut.
Pour une animation fluide, j'ai utilisé @Sharj answer, qui est NestedScrollView.fullScroll(View.FOCUS_UP);
Mais mon AppBar n’est pas visible, donc je dois développer l’AppBar comme suit appBarLayout1.setExpanded(true)
. Donc, en utilisant ces trois, je peux facilement aller en haut de la page.
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
Vous pouvez facilement simuler le défilement au niveau NestedScrollView. Vous dites en gros à coordinatorLayout que vous venez de faire défiler la hauteur de la barre d’outils.
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());
Vous pouvez l'utiliser pour un défilement régulier.
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);
OR pour le défilement normal
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
Ajouter la ligne deux fois. Travaillé pour moi
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
J'ai essayé toutes les réponses ci-dessus, rien ne semblait marcher mais il me suffisait d'un post-différé.
scrollview.postDelayed(new Runnable() {
@Override
public void run() {
listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
scrollview.fullScroll(View.FOCUS_DOWN);
}
}, 400);
Utilisez plutôt View.scollTo (int x, int y) pour faire défiler vers le haut.
findViewById({your NestedScrollView resource id}).scrollTo(0, 0);