Je voudrais faire défiler vers le bas de la liste RecyclerView après le chargement de l'activité.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
lève une exception concernant la non prise en charge dans RecyclerView et conversationView.scrollToPosition(...)
ne semble rien faire.
Après le bloc de code ci-dessus, j'ai ajouté
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
ce qui ne marche pas. Il y a 30 éléments dans GENERIC_MESSAGE_LIST
.
scrollToPosition
immédiatement après avoir configuré l'adaptateur?conversationView.setAdapter(conversationViewAdapter);
.Réponses:
Réglez simplement
setStackFromEnd=true
ousetReverseLayout=true
pour que LLM mettra en page les éléments de la fin.La différence entre ces deux est que
setStackFromEnd
la vue affichera le dernier élément, la direction de la disposition restera la même. (Ainsi, dans une vue de recyclage horizontale de gauche à droite, le dernier élément sera affiché et le défilement vers la gauche affichera les éléments précédents)Alors 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 le plus à gauche dans une vue LTR Recycler, puis le défilement vers la droite affichera les éléments précédents.Échantillon:
Consultez la documentation pour plus de détails.
la source
Je regardais ce post pour trouver la réponse mais ... Je pense que tout le monde sur ce post faisait face au même scénario que moi: a
scrollToPosition()
été totalement ignoré, pour une raison évidente.Qu'est-ce que j'utilisais?
... ce TRAVAILLE ?
la source
recyclerView.scrollToPosition(messages.size()-1);
fonctionne vraiment pour moi, je me demande juste la raison.smoothScrollToPosition(...)
.Je sais qu'il est tard pour répondre ici, mais si quelqu'un veut savoir que la solution est ci-dessous
la source
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
comme les positions dans les listes sont basées sur zéro.Pour faire défiler vers le bas depuis n'importe quelle position dans la vue de recyclage
la source
Ajoutez ce code après l'envoi du message et avant de recevoir le message du serveur
la source
Lorsque vous appelez
setAdapter
, cela ne met pas immédiatement en page et ne positionne pas les éléments sur l'écran (cela prend une seule passe de mise en page), par conséquent, votrescrollToPosition()
appel n'a aucun élément réel vers lequel faire défiler lorsque vous l'appelez.Au lieu de cela, vous devez enregistrer un ViewTreeObserver.OnGlobalLayoutListener (via addOnGlobalLayoutListner () à partir d'un
ViewTreeObserver
créé parconversationView.getViewTreeObserver()
) qui retarde votrescrollToPosition()
jusqu'à après le premier passage de mise en page:la source
OnGlobalLayoutListener
probablement pas supprimé parce que vous recherchezvto.isAlive()
. Je ne connais pas la raison, maisViewTreeObserver
parfois est changé pour unView
, donc au lieu de vérifier pourisAlive
vous, mieux vaut simplement vous mettre au courantViewTreeObserver
avecconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Solution pour Kotlin :
appliquer le code ci-dessous après avoir défini "recyclerView.adapter" ou après "recyclerView.adapter.notifyDataSetChanged ()"
la source
À Kotlin:
la source
GlobalLayoutListener
! Après refactoring, j'ai dû utiliser votre méthode pour faire défiler. N'oubliez pas de supprimer l'auditeur comme dans stackoverflow.com/questions/28264139/… , ou vous ne ramènerez pas RecyclerView au début.et
le code ci-dessus fonctionne, mais ce n'est pas fluide et pas cool.
la source
SI vous avez un adaptateur connecté avec recyclerView, faites-le simplement.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
la source
La réponse Roc est d'une grande aide. Je voudrais y ajouter un petit bloc:
la source
Dans mon cas où les vues n'ont pas la même hauteur, appeler scrollToPosition sur le LayoutManager a fonctionné pour vraiment faire défiler vers le bas et voir pleinement le dernier élément:
la source
Défilement initial lors de la première entrée dans la vue du recycleur, puis utilisation
mettre moins pour faire défiler vers le bas pour faire défiler vers le haut mettre en valeur positive);
si la vue est très grande en hauteur, le décalage particulier de scrolltoposition est utilisé pour le haut de la vue, vous utilisez
la source
Cela fonctionne parfaitement bien pour moi:
la source
Seule la réponse d'Ian a pu faire mon
RecyclerView
parchemin à une position spécifiée. Cependant, leRecyclerView
n'a pas pu faire défiler après quand j'ai utiliséscrollToPosition()
.smoothScrollToPosition()
fonctionnait mais l'animation initiale le rendait trop lent lorsque la liste était longue. La raison était que l'auditeur n'a pas été supprimé. J'ai utilisé le code ci-dessous pour supprimer le courantViewTreeObserver
et cela a fonctionné comme un charme.la source
ce code vous donnera d'abord le dernier message, je pense que cette réponse est utile.
la source
J'ai essayé une méthode de @galex , cela a fonctionné jusqu'à la refactorisation. J'ai donc utilisé une réponse de @yanchenko et j'ai changé un peu. C'est probablement parce que j'ai appelé scrolling from
onCreateView()
, où une vue fragmentée a été construite (et n'avait probablement pas la bonne taille).Vous pouvez également ajouter un chèque
viewTreeObserver.isAlive
comme sur https://stackoverflow.com/a/39001731/2914140 .la source
Si aucun de ceux-ci ne fonctionnait,
vous devriez essayer d'utiliser:
En faisant cela, vous demandez un certain ConstraintLayout (ou ce que vous avez) à afficher. Le parchemin est instantané.
Je travaille même avec le clavier montré.
la source