web-dev-qa-db-fra.com

Comment obtenir la position de défilement dans Recyclerview/Layoutmanager?

Comment obtenir la position de défilement dans Recyclerview ou la Layoutmanager?

Je peux mesurer la position de défilement en ajoutant un OnScrollListener, mais lorsque l’orientation change, scrollDy vaut 0.

    mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            int scrollDy = 0;
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                scrollDy += dy;
            }
        });
18
seb

Vous ne pouvez pas l'obtenir parce que cela n'existe pas vraiment. LayoutManager ne connaît que les vues à l'écran, il ne connaît pas les vues auparavant, quelle est leur taille, etc.

Le nombre que vous pouvez compter à l'aide de l'écouteur de défilement n'est pas fiable car si les données changent, RecyclerView effectuera un nouveau calcul de disposition et n'essaiera pas de recalculer un décalage réel (vous recevrez un onScroll(0, 0) si les vues sont déplacées).

RecyclerView estime cette valeur pour les barres de défilement, vous pouvez utiliser les mêmes méthodes qu'à partir de la classe View.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

Ces méthodes ont aussi leurs contreparties verticales.

34
yigit

Pour une utilisation ultérieure, si vous passez de Fragments à l’intérieur de la même activity et que vous voulez simplement enregistrer save scroll-position pour recyclerview puis restaurer recyclerview à la même position de défilement, vous pouvez procéder suit:

Dans votre onStop()/onDestroyView()/onPause() quel que soit le rappel le plus approprié, procédez comme suit:

Parcelable recylerViewState = recyclerView.getLayoutManager().onSaveInstanceState();

Et dans votre onStart()/onCreateView()/onResume() quel que soit le rappel le plus approprié, procédez comme suit:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);

De cette façon, vous pouvez conserver votre état recyclerView's dans une parcelable et le restaurer à tout moment.

14
Shoaib Anwar

Vous avez trouvé un moyen de contourner la dernière position dans la variable RecyclerView avec des crédits à Suragch solution ... Déclarez une LinearLayoutManager globalement accessible afin de pouvoir y accéder via des méthodes internes ... quelle que soit la méthode populateChatAdapter qui soit appelée, si c'est le premier appel, scroll to position sera le dernier message envoyé et si l'utilisateur a fait défiler pour afficher les messages précédents et que la méthode est appelée à nouveau pour mettre à jour de nouveaux messages, ils conservent leur dernier défilement en position ...

LinearLayoutManager linearLayoutManager;
int lastScrollPosition = 0;
RecyclerView messages_recycler;

Initiez-les ...

messages_recycler = findViewById(R.id.messages_recycler);
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setStackFromEnd(true);
messages_recycler.setLayoutManager(linearLayoutManager);

Sur votre méthode d'adaptateur de population

private void populateChatAdapter(ObservableList<ChatMessages> msgs) {

    if (lastScrollPosition==0) lastScrollPosition = msgs.size()-1;
    ChatMessagesRecycler adapter = new ChatMessagesRecycler(msgs);
    messages_recycler.setAdapter(adapter);
    messages_recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            lastScrollPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
        }
    });
    messages_recycler.scrollToPosition(lastScrollPosition);
}
0
Von Neumann

Vous devez lire scrollDy dans 

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

alors vous pouvez obtenir la position de défilement recyclerView's

0
paju_man