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;
}
});
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.
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.
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);
}
Vous devez lire scrollDy
dans
public void onScrollStateChanged(RecyclerView recyclerView, int newState)
alors vous pouvez obtenir la position de défilement recyclerView'
s