Ich suche nach einer Möglichkeit, einen Bildlauf durchzuführen RecyclerView
, um das ausgewählte Element oben anzuzeigen.
In a konnte ListView
ich dies tun, indem scrollTo(x,y)
ich die Oberseite des Elements, das zentriert werden muss, verwendete und abrief.
Etwas wie:
@Override
public void onItemClick(View v, int pos){
mylistView.scrollTo(0, v.getTop());
}
Das Problem ist, dass das RecyclerView
einen Fehler zurückgibt, wenn es seine scrollTo
Methode verwendet, die sagt
RecyclerView unterstützt das Scrollen zu einer absoluten Position nicht
Wie kann ich einen Bildlauf durchführen RecyclerView
, um das ausgewählte Element oben in der Ansicht zu platzieren?
quelle
Wenn Sie nach vertikalem LinearLayout Manager suchen, können Sie mit einem benutzerdefinierten Objektiv einen reibungslosen Bildlauf erzielen
LinearSmoothScroller
:Verwenden Sie eine Instanz des Layoutmanagers in der Recyclingansicht. Wenn Sie dann aufrufen,
recyclerView.smoothScrollToPosition(pos);
wird der Bildlauf an die ausgewählte Position zum oberen Rand der Recyclingansicht verschobenquelle
getHorizontalSnapPreference()
im TopSnappedSmoothScroller für horizontale Listen.RecyclerView
? Welches ist zu sagen: Das ist nicht das letzte Element zu funktionieren scheint - unabhängig von denSNAP_TO_START
dieRecyclerView
nur scrollt , bis das Element am unteren Rand sichtbar wird , aber bis es nicht den ganzen Weg bewegen. Irgendwelche Ideen, wie dies erreicht werden kann? (Ich habe diesRecyclerView
// Bildlaufposition pos
quelle
Sie müssen nur anrufen
recyclerview.scrollToPosition(position)
. Das ist gut!Wenn Sie es im Adapter aufrufen möchten, lassen Sie Ihren Adapter einfach die Instanz von recyclerview oder die Aktivität oder das Fragment haben, die recyclerview enthält, und implementieren dann die Methode
getRecyclerview()
in ihnen.Ich hoffe es kann dir helfen.
quelle
Gleiches gilt für den Geschwindigkeitsregler
quelle
Probieren Sie aus, was für mich cool funktioniert hat!
Erstellen Sie eine Variable
private static int displayedposition = 0;
Nun zur Position Ihres RecyclerView in Ihrer Aktivität.
Platzieren Sie diese Anweisung an der Stelle, an der die zuvor in Ihrer Ansicht angezeigte Site platziert werden soll.
Nun, das war's, es hat gut funktioniert für mich \ o /
quelle
Rufen Sie diese Methode einfach auf:
anstatt:
quelle
Was ich getan habe, um die Bildlaufposition wiederherzustellen, nachdem die Schaltfläche RecyclerView on aktualisiert wurde?
Abrufen des Versatzes des ersten sichtbaren Elements von oben vor dem Erstellen des linearLayoutManager-Objekts und Aufrufen des scrollToPositionWithOffset des LinearLayoutManager-Objekts nach dem Instanziieren.
quelle
Ich weiß nicht, warum ich nicht die beste Antwort gefunden habe, aber es ist wirklich einfach.
Keine Fehler
Erstellt Animationen
quelle
Scrollen Sie an einer bestimmten Position und das hat mir sehr geholfen. Durch Klicken auf Listener können Sie die Position in Ihrem Adapter erhalten
quelle
quelle
Keine der Antworten erklärt, wie die letzten Elemente oben angezeigt werden. Die Antworten funktionieren also nur für Elemente, über oder unter denen noch genügend Elemente vorhanden sind, um die verbleibenden zu füllen
RecyclerView
. Wenn beispielsweise 59 Elemente vorhanden sind und ein 56. Element ausgewählt ist, sollte es wie in der folgenden Abbildung oben angezeigt werden:Wir könnten diese Fälle behandeln, indem wir
linearLayoutManager.scrollToPositionWithOffset(pos, 0)
eine zusätzliche Logik inAdapter
of verwendenRecyclerView
- indem wir einen benutzerdefinierten Rand unter dem letzten Element hinzufügen (wenn das letzte Element nicht sichtbar ist, bedeutet dies, dass genügend Platz vorhanden istRecyclerView
). Der benutzerdefinierte Rand kann ein Unterschied zwischen der Höhe der Stammansicht und der Höhe des Elements sein. IhrAdapter
forRecyclerView
würde also wie folgt aussehen:quelle
In meinem Fall habe
RecyclerView
ich so ein PolsteroberteilDann muss ich zum Scrollen eines Elements nach oben
quelle
Wenn Du
LayoutManager
bistLinearLayoutManager
verwenden SiescrollToPositionWithOffset(position,0);
darauf und es wird Ihren Artikel das erste sichtbare Element in der Liste machen. Ansonsten können SiesmoothScrollToPosition
auf dem verwendenRecyclerView
direkt verwenden.Am Ende habe ich den folgenden Code verwendet.
quelle
Ich verwende den folgenden Code, um ein Element (thisView) reibungslos nach oben zu scrollen.
Es funktioniert auch für GridLayoutManager mit Ansichten unterschiedlicher Höhe:
Scheint gut genug für eine schnelle Lösung zu funktionieren.
quelle
thisPosition
?