8
votes

Android: StaggeredgridlayoutManager Faites défiler jusqu'au sommet pendant l'initialisation

J'utilise StaggeredGridLayOutManager pour mon image Galerie. J'ai défini setrverselayout (true) code>, de sorte que les images soient empilées du bas.

Le problème que je suis confronté est qu'à l'initialisation de l'application, les points de défilement au bas de la galerie. Je voudrais que le rouleau soit au sommet de la galerie lorsque l'utilisateur commence par l'utilisateur. P>

J'ai essayé d'utiliser ScrollToposition code> (extrait de code suivant), mais le rouleau se termine quelque part au milieu de la galerie, probablement parce que les images ne sont pas chargées correctement à la Temps d'appel ScrollToposition CODE>. P>

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
    mLayoutManager.setReverseLayout(true);

mRecyclerView.setLayoutManager(mLayoutManager);
mImageList = ((MainActivity)getActivity()).getImages();
adapter = new ImageAdapter(getActivity(),mImageList);
mRecyclerView.setAdapter(adapter);
mRecyclerView.scrollToPosition(mImageList.size()-1);


0 commentaires

5 Réponses :



1
votes

Essayez d'utiliser ScrollTopositionWithOffset () Code> Fonction de StaggeredgridlayoutManager code> à la place. J'ai trouvé cela plus fiable que ScrollToposition code>. Assurez-vous également que vous exécutez cette fonction à l'intérieur gestionnaire (). POST () CODE>. Cela causera le annulable code> à ajouter à la file d'attente de messagerie. Il fonctionnera une fois le fil d'interface utilisateur libre.

new Handler().post(new Runnable() {
            @Override
            public void run() {
                staggeredGridLayoutManager.scrollToPositionWithOffset(mImageList.size() - 1, 0);
            }
        });


1 commentaires

Malheureusement, ça n'a pas fonctionné pour moi. Merci d'avoir répondu



1
votes

J'ai utilisé ScrollTopImposition à l'intérieur du dataObserver et cela fonctionne maintenant bien ..

Lorsque les charges de recyclerview sont visibles avec le code ci-dessous: P>

     rcAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
                    @Override
                    public void onItemRangeInserted(int positionStart, int itemCount) {
                        super.onItemRangeInserted(positionStart, itemCount);
                        int count = rcAdapter.getItemCount();
                        int lastVisiblePositions[] = new int[2]; //for 2 columns
                        int lastVisiblePosition = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(lastVisiblePositions)[0];
                        // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll
                        // to the bottom of the list to show the newly added message.
                        if (lastVisiblePosition == -1 ||
                            (positionStart >= (count- 1) && lastVisiblePosition == (positionStart - 1))) {
                           mRecyclerView.scrollToPosition(positionStart);
                        }

                    }
                });


1 commentaires

Semble intéressant.



3
votes

J'ai résolu un problème similaire avant et voici la méthode: xxx pré>

et: p> xxx pré>

et: p>

private void scrollRecyclerViewToTop() {
    mRecyclerView.scrollToPosition(0);
    mRecyclerView.scrollBy(0, Integer.MIN_VALUE);
}


1 commentaires

Cela fonctionne lorsque je touche l'écran mais rien ne se présente si je ne touche pas. Je veux faire défiler la valeur par défaut qui est l'utilisateur ne nécessite pas de toucher. C'est la réponse la plus proche, donc je vais attribuer une prime pour vous. btw ma réponse fonctionne comme je veux.



0
votes

Ce code peut vous aider, j'ai également utilisé ce lien dans le code

https://guides.codepath.com/android/endless-scrolling-withAdapterviews-and-RecyClerview

Chaque adaptateur (telle que ListView and GridView) prend en charge liaison aux événements Onscrolllistener qui sont déclenchés chaque fois qu'un L'utilisateur fait défiler la collection. Utilisation de ce système, nous pouvons définir une extrémité sans fin de base qui soutient la plupart des cas d'utilisation par Créer notre propre classe qui s'étend sur ongrolllistener: xxx


0 commentaires