3 votes

RecyclerView dans setReverseLayout défilement vers le haut (ou le bas)

Je m'excuse pour ce titre potentiellement trompeur, mais je ne savais pas comment le formuler. Si quelqu'un d'autre pense pouvoir trouver quelque chose de mieux, n'hésitez pas à le modifier.

J'ai un RecyclerView que je remplis avec des enregistrements Firebase. Pour que les enregistrements les plus récents apparaissent en haut de la liste, j'ai défini mon RecvlerView comme suit setReverseLayout(true) y setStackFromEnd(true) comme suggéré aquí . Cela fonctionne très bien lorsque le nombre d'éléments s'adapte à l'espace de l'écran - les autres éléments défilent doucement vers le bas, laissant la place au nouvel élément qui apparaît en fondu, comme illustré ci-dessous.

Good

Le problème est que lorsque les éléments existants occupent tout l'espace de l'écran, le nouvel élément est ajouté "au-dessus" des autres et la vue de recyclage s'étend effectivement au-dessus du haut de l'écran, de sorte que pour voir le nouvel élément, je dois tirer ou faire défiler la liste vers le bas manuellement. Un autre GIF ci-dessous ;

Bad

Comment puis-je surmonter cela ?

4voto

I.K. Points 41
final int SCROLLING_UP = -1;
boolean scrollToNewTop = !recyclerView.canScrollVertically(SCROLLING_UP);
//TODO update adapter here
adapter.notifyItemInserted(adapter.getItemCount() - 1);
if (scrollToNewTop) {
    recyclerView.scrollToPosition(adapter.getItemCount() - 1);
}

Cela vous fera défiler vers le haut si vous êtes tout en haut et laissera tout en l'état si vous êtes quelque part au milieu, vous évitant ainsi des sauts ennuyeux.

1voto

Androidss Points 35

Ceci peut aider :

adapter.notifyItemInserted(position);
recyclerView.scrollToPosition(position);

0voto

  mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            int testimonycount = mAdapter.getItemCount();
            int lastVisiblePosition =
                    linearLayoutManager.findLastCompletelyVisibleItemPosition();
            // 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 >= (testimonycount - 1) &&
                            lastVisiblePosition == (positionStart - 1))) {
                recipeRecyclerview.scrollToPosition(positionStart);
            }
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X