In einer RecyclerView kann ich plötzlich zum Anfang eines ausgewählten Elements scrollen, indem ich Folgendes verwende:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Dadurch wird der Gegenstand jedoch abrupt in die oberste Position gebracht. Ich möchte reibungslos an die Spitze eines Elements gelangen .
Ich habe auch versucht:
recyclerView.smoothScrollToPosition(position);
Es funktioniert jedoch nicht gut, da das Objekt nicht an die oben ausgewählte Position verschoben wird. Es wird lediglich ein Bildlauf durch die Liste durchgeführt, bis das Element an der Position sichtbar ist.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Außerdem musste ich die abstrakte Methode implementierenpublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.Dazu müssen Sie einen benutzerdefinierten LayoutManager erstellen
Verwenden Sie dies für Ihre RecyclerView und rufen SieoothScrollToPosition auf.
Beispiel:
Dadurch wird zum RecyclerView-Element der angegebenen Position gescrollt.
hoffe das hilft.
quelle
smoothScrollToPosition
. Warum kann dieses Problem auftreten? Vielen Dank.Dies ist eine Erweiterungsfunktion, die ich in Kotlin geschrieben habe , um sie mit der
RecyclerView
(basierend auf der Antwort von @Paul Woitaschek) zu verwenden:Verwenden Sie es so:
quelle
Wir können es so versuchen
quelle
Überschreiben Sie die Funktion berechneDyToMakeVisible / berechneDxToMakeVisible in LinearSmoothScroller, um die versetzte Y / X-Position zu implementieren
quelle
Der einfachste Weg, einen Bildlauf durchzuführen,
RecyclerView
ist folgender:quelle
Ich benutzte so:
quelle
Danke, @droidev für die Lösung. Wenn jemand nach einer Kotlin-Lösung sucht, beziehen Sie sich auf Folgendes:
quelle
CustomLinearLayout.kt:
Hinweis: Das obige Beispiel ist auf die Richtung HORIZONTAL eingestellt. Sie können während der Initialisierung VERTICAL / HORIZONTAL übergeben.
Wenn Sie die Richtung auf VERTICAL setzen , sollten Sie " berechneDxToMakeVisible " in " berechneDyToMakeVisible " ändern (beachten Sie auch den Rückgabewert des Supertyps).
Aktivität / Fragment.kt :
quelle
Wahrscheinlich ist der @ droidev-Ansatz der richtige, aber ich möchte nur etwas anderes veröffentlichen, das im Grunde den gleichen Job macht und keine Erweiterung des LayoutManager erfordert.
Ein HINWEIS hier - dies funktioniert gut, wenn Ihr Element (das, das Sie oben in der Liste scrollen möchten) auf dem Bildschirm angezeigt wird und Sie es nur automatisch nach oben scrollen möchten. Dies ist nützlich, wenn das letzte Element in Ihrer Liste eine Aktion enthält, mit der neue Elemente in derselben Liste hinzugefügt werden und Sie den Benutzer auf die neu hinzugefügten Elemente konzentrieren möchten:
Die Idee ist einfach: 1. Wir müssen die oberste Koordinate des recyclerview-Elements ermitteln. 2. Wir müssen die obere Koordinate des Ansichtselements ermitteln, das nach oben gescrollt werden soll. 3. Am Ende mit dem berechneten Offset müssen wir tun
200 ist nur ein Beispiel für einen fest codierten Ganzzahlwert, den Sie verwenden können, wenn das Viewholder-Element nicht vorhanden ist, da dies ebenfalls möglich ist.
quelle
Ich möchte mehr vollständig das Problem der Adresse Scroll Dauer , die, sollten Sie eine frühere Antwort wählen, wird in der Tat variiert dramatisch (und unakzeptabel) entsprechend der erforderlichen Menge des Scrollens der Zielposition von der aktuellen Position zu erreichen.
Um eine einheitliche Bildlaufdauer zu erhalten, muss die Geschwindigkeit (Pixel pro Millisekunde) die Größe jedes einzelnen Elements berücksichtigen - und wenn die Elemente nicht standardmäßige Abmessungen haben, wird eine völlig neue Komplexität hinzugefügt.
Dies könnte der Grund sein, warum die RecyclerView- Entwickler den zu harten Korb für diesen wichtigen Aspekt des reibungslosen Bildlaufs bereitgestellt haben .
Unter der Annahme , dass Sie einen wollen halb einheitliche Scroll - Dauer, und dass Ihre Liste enthält halb einheitliche Elemente dann werden Sie so etwas wie dieses benötigen.
PS: Ich verfluche den Tag, an dem ich angefangen habe , ListView wahllos in RecyclerView zu konvertieren .
quelle