web-dev-qa-db-fra.com

Faites défiler par programme vers le haut d'un NestedScrollView

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.

57
lukas1994

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);
}

10000 est la vitesse dans la direction y.

41
lukas1994
NestedScrollView.scrollTo(0, 0);
77
SilentKnight

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);
28
Sharj

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);
16
Vulovic Vukasin

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);
10
Vidu

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());
8
user1259201

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);
3
Ali Akram

Ajouter la ligne deux fois. Travaillé pour moi

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
1
Saljith Kj

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);
1
MontDeska

Utilisez plutôt View.scollTo (int x, int y) pour faire défiler vers le haut.

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
1
Sokdara Cheng