web-dev-qa-db-fra.com

Défiler automatiquement vers le bas de RecyclerView

J'ai un fragment qui a un RecyclerView à l'intérieur de son fichier de disposition. RecyclerView conserve les messages dans une discussion. Alors naturellement, j'ai besoin de RecyclerView pour faire défiler vers le bas lorsque le fragment de conversation est ouvert. 

J'ai essayé de faire défiler directement sur le RecyclerView:

var mRecyclerView = view.FindViewById<RecyclerView>
mRecyclerView.ScrollToPosition(mMessages.Count-1);

Deuxième méthode:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPosition(mMessages.Count - 1);      

Troisième méthode:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPositionWithOffset(mMessages.Count - 1, 0);

Malheureusement, rien ne se passe dans les deux cas. Toutes les suggestions seraient grandement appréciées! 

8
rasperryPi

Veuillez utiliser smoothScrollToPosition pour résoudre votre problème . J'utilise toujours smoothScrollToPosition pour rediriger les messages vers n’importe quel poste.

Assurez-vous que la taille de mMessages est bonne lorsque vous réfléchissez.

Exemple,

RecyclerView rv = (RecyclerView)findViewById(R.id.recyclerView);
rv.smoothScrollToPosition(mMessages.count-1);
9
Narendra Sorathiya

Vous pouvez définir setStackFromEnd=true pour que la vue affiche le dernier élément, la direction de la présentation demeurant la même.

Après l'édition, j'ai mis à jour: comme ceci: 

   LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
   mLinearLayoutManager.setStackFromEnd(true); 
   mRecyclerView.SetLayoutManager(mLinearLayoutManager);
   mRecyclerView.scrollToPosition(mMessages.Count-1);

veuillez vérifier la documentation .

Edit: le problème, c'est que vous appelez scrollToPosition sans définir de gestionnaire de disposition sur la vue recyclée.

Compte tenu de la fonction scrollToPosition de la classe RecyclerView, votre cas a du sens.

/**
     * Convenience method to scroll to a certain position.
     *
     * RecyclerView does not implement scrolling logic, rather forwards the call to
     * {@link Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)}
     * @param position Scroll to this adapter position
     * @see Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)
     */
    public void scrollToPosition(int position) {
        if (mLayoutFrozen) {
            return;
        }
        stopScroll();
        if (mLayout == null) {
            Log.e(TAG, "Cannot scroll to position a LayoutManager set. " +
                    "Call setLayoutManager with a non-null argument.");
            return;
        }
        mLayout.scrollToPosition(position);
        awakenScrollBars();
    }

Impossible de faire défiler pour positionner un ensemble LayoutManager. Appelez setLayoutManager avec un argument non nul.

4
ziLk

Je crois que vous ne l'appelez pas de la bonne façon. Pour que cela fonctionne, vous devez également passer LinearLayoutManager et la vue Recycler. Voici comment je l'ai fait fonctionner

mLayoutManager.smoothScrollToPosition(mRecyclerView, null, array.size() - 1);
2
Irfan Raza

J'ai trouvé le problème, définissez RecyclerView scrollToPosition ou smoothScrollToPosition après avoir défini LayoutManager.

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.scrollToPosition(mMessages.count - 1);

J'espère que cela vous aidera.

1
Shamsul

Il suffit de définir setStackFromEnd=true ou setReverseLayout=true pour que LLM organise les éléments à partir d’une fin.

La différence entre ces deux éléments est que setStackFromEnd configurera la vue pour afficher le dernier élément, la direction de la présentation demeurant la même. (Ainsi, dans une vue horizontale du récupérateur de gauche à droite, le dernier élément sera affiché et le défilement vers la gauche affichera les éléments les plus anciens)

Tandis que setReverseLayout changera l'ordre des éléments ajoutés par l'adaptateur. La mise en page commencera à partir du dernier élément, qui sera l'élément le plus à gauche dans une vue du recycleur LTR, puis un défilement vers la droite affichera les éléments précédents.

Échantillon :

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);
0
Vishrut Mavani