Ich möchte nach dem Laden der Aktivität zum Ende der RecyclerView-Liste scrollen.
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(...)
conversationView.scrollToPosition(...)
löst eine Ausnahme aus, dass es in RecyclerView nicht unterstützt wird, und scheint nichts zu tun.
Nach dem obigen Codeblock habe ich hinzugefügt
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
was nicht funktioniert. Es gibt 30 Elemente in GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
Waylaidwanderer
quelle
quelle
scrollToPosition
sofort nach dem Einstellen des Adapters an?conversationView.setAdapter(conversationViewAdapter);
.Antworten:
Stellen Sie einfach
setStackFromEnd=true
odersetReverseLayout=true
so ein, dass LLM Elemente von Ende an anordnet.Der Unterschied zwischen diesen beiden ist der
setStackFromEnd
in der Ansicht das letzte Element angezeigt wird und die Layoutrichtung gleich bleibt. (In einer horizontalen Recycler-Ansicht von links nach rechts wird das letzte Element angezeigt, und wenn Sie nach links scrollen, werden die früheren Elemente angezeigt.)Die
setReverseLayout
Reihenfolge der vom Adapter hinzugefügten Elemente wird geändert. Das Layout beginnt mit dem letzten Element, das in einer LTR-Recycler-Ansicht ganz links steht. Wenn Sie dann nach rechts scrollen, werden die früheren Elemente angezeigt.Stichprobe:
Einzelheiten finden Sie in der Dokumentation .
quelle
Ich habe mir diesen Beitrag angesehen, um die Antwort zu finden, aber ... Ich glaube, jeder in diesem Beitrag hatte das gleiche Szenario wie ich:
scrollToPosition()
wurde aus einem offensichtlichen Grund vollständig ignoriert.Was ich benutzt habe?
... was hat funktioniert ?
quelle
recyclerView.scrollToPosition(messages.size()-1);
funktioniert wirklich für mich, ich frage mich nur den Grund.smoothScrollToPosition(...)
.Ich weiß, dass es spät ist, hier zu antworten, aber wenn jemand wissen will, ob die Lösung unten ist
quelle
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
Positionen in Listen auf Null basieren.Zum Scrollen von einer beliebigen Position in der Recyclingansicht nach unten
quelle
Fügen Sie diesen Code nach dem Senden der Nachricht und vor dem Abrufen der Nachricht vom Server hinzu
quelle
Wenn Sie anrufen
setAdapter
, werden Elemente nicht sofort auf dem Bildschirm angeordnet und positioniert (dies erfordert einen einzelnen Layoutdurchlauf), sodass IhrscrollToPosition()
Anruf keine tatsächlichen Elemente enthält, zu denen Sie beim Aufrufen scrollen können.Stattdessen sollten Sie einen ViewTreeObserver.OnGlobalLayoutListener (über addOnGlobalLayoutListner () von einem
ViewTreeObserver
erstellten vonconversationView.getViewTreeObserver()
) registrieren, der Ihre VerzögerungscrollToPosition()
bis nach dem ersten Layoutdurchlauf verzögert :quelle
OnGlobalLayoutListener
wird wahrscheinlich nicht entfernt, weil Sie nach suchenvto.isAlive()
. Ich kenne den Grund nicht, aberViewTreeObserver
manchmal wird es für a geändertView
, also anstatt nachisAlive
dir zu suchen, werde einfach besserViewTreeObserver
mitconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Lösung für Kotlin :
Wenden Sie den folgenden Code an, nachdem Sie "recyclerView.adapter" oder "recyclerView.adapter.notifyDataSetChanged ()" festgelegt haben.
quelle
In Kotlin:
quelle
GlobalLayoutListener
! Nach dem Refactoring musste ich Ihre Methode zum Scrollen verwenden. Vergessen Sie nicht, den Listener wie in stackoverflow.com/questions/28264139/… zu entfernen, sonst scrollen Sie RecyclerView nicht zurück zum Anfang.und
Der obige Code funktioniert, ist aber nicht flüssig und nicht cool.
quelle
Wenn Sie einen Adapter an recyclerView angeschlossen haben, tun Sie dies einfach.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
quelle
Roc Antwort ist eine große Hilfe. Ich möchte einen kleinen Block hinzufügen:
quelle
In meinem Fall, in dem Ansichten nicht dieselbe Höhe haben, hat der Aufruf von scrollToPosition im LayoutManager dazu beigetragen , wirklich nach unten zu scrollen und das letzte Element vollständig anzuzeigen :
quelle
Das funktioniert bei mir einwandfrei:
quelle
Scrollen Sie zum ersten Mal, wenn Sie zum ersten Mal in die Recycler-Ansicht wechseln, und verwenden Sie dann
Minus eingeben für Bildlauf nach unten für Bildlauf nach oben (positiver Wert);
Wenn die Ansicht sehr groß ist, wird für den oberen Bereich der Ansicht ein bestimmter Versatz für die Bildlaufposition verwendet
quelle
Nur Ians Antwort konnte meine
RecyclerView
Schriftrolle an eine bestimmte Position bringen. Allerdings konnte TheRecyclerView
danach nicht mehr scrollen, als ich es benutztescrollToPosition()
.smoothScrollToPosition()
funktionierte, aber die anfängliche Animation machte es zu langsam, wenn die Liste lang war. Der Grund war, dass der Hörer nicht entfernt wurde. Ich habe den folgenden Code verwendet, um den Strom zu entfernen,ViewTreeObserver
und es hat als Zauber gewirkt.quelle
Dieser Code gibt Ihnen zuerst den neuesten Beitrag. Ich denke, diese Antwort ist hilfreich.
quelle
Versuchte eine Methode von @galex , es funktionierte bis zum Refactoring. Also habe ich eine Antwort von @yanchenko verwendet und mich ein bisschen verändert. Wahrscheinlich liegt das daran, dass ich das Scrollen von
onCreateView()
dort aus aufgerufen habe , wo eine Fragmentansicht erstellt wurde (und wahrscheinlich nicht die richtige Größe hatte).Sie können auch unter https://stackoverflow.com/a/39001731/2914140 einen Check von
viewTreeObserver.isAlive
like hinzufügen .quelle
Wenn nichts davon funktioniert hat,
Sie sollten versuchen zu verwenden:
Auf diese Weise fordern Sie die Anzeige eines bestimmten ConstraintLayout (oder was auch immer Sie haben) an. Die Schriftrolle ist sofort.
Ich arbeite sogar mit der gezeigten Tastatur.
quelle