Snappy Scrollen in RecyclerView
Ich bin versucht, die neue RecyclerView
Klasse für ein Szenario, in dem ich die Komponente snap, um ein bestimmtes element beim scrollen (Die alten Android - Gallery
in den Sinn kommt als ein Beispiel für eine solche Liste mit einem center-gesperrt-Position).
Dies ist der Ansatz, dass ich den so weit:
Habe ich eine Schnittstelle ISnappyLayoutManager
enthält eine Methode, die getPositionForVelocity
berechnet, an welcher position die anzeigen sollten am Ende den scrollen angesichts der ersten Flugstunde Geschwindigkeit.
public interface ISnappyLayoutManager {
int getPositionForVelocity(int velocityX, int velocityY);
}
Dann habe ich eine Klasse SnappyRecyclerView
, die Unterklassen RecyclerView
ist, und überschreibt seinen Seitensprung () - Methode in einer Weise zu werfen, um die genaue richtige Menge:
public final class SnappyRecyclerView extends RecyclerView {
/** other methods deleted **/
@Override
public boolean fling(int velocityX, int velocityY) {
LayoutManager lm = getLayoutManager();
if (lm instanceof ISnappyLayoutManager) {
super.smoothScrollToPosition(((ISnappyLayoutManager) getLayoutManager())
.getPositionForVelocity(velocityX, velocityY));
}
return true;
}
}
Ich bin nicht sehr glücklich mit diesem Ansatz aus mehreren Gründen. Zunächst scheint es, entgegen der Philosophie der "RecyclerView" zu haben, um eine Unterklasse zu verwirklichen ist eine bestimmte Art von Blättern. Zweitens, wenn ich will benutzen Sie einfach die Standard - LinearLayoutManager
wird es etwas komplexer, wie ich Durcheinander herum mit seinen Einbauten um zu verstehen, seine aktuellen scroll-Zustand und berechnen genau, wo diese Schriftrollen. Schließlich, dies nicht kümmern uns auch um alle möglichen Blättern Szenarien, als wenn Sie die Liste verschieben und dann pause und dann heben Sie einen finger, kein Seitensprung-Ereignis tritt ein (die Geschwindigkeit ist zu niedrig) und so die Liste bleibt in einer position auf halbem Weg. Dies kann unter Umständen übernommen werden, indem ein auf Blättern Status-listener, um die RecyclerView
, aber das fühlt sich auch sehr hacky.
Ich das Gefühl, ich muss etwas fehlen. Gibt es einen besseren Weg, dies zu tun?
InformationsquelleAutor der Frage Catherine | 2014-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich kommen mit etwas, die etwas anders als die oben genannten. Es ist nicht ideal, aber es funktioniert akzeptabel gut für mich, und kann hilfreich sein, um jemand anderes. Ich werde nicht akzeptieren, dass diese Antwort in der Hoffnung, dass jemand kommt mit etwas besser und weniger hacky (und es ist möglich, dass bin ich Missverständnis der
RecyclerView
Umsetzung und die fehlende einfache Möglichkeit, dies zu tun, aber in der Zwischenzeit, das ist gut genug für Regierung arbeiten!)Werden die Grundlagen der Umsetzung sind diese: Das scrollen in einer
RecyclerView
ist sozusagen aufgeteilt zwischen denRecyclerView
und dieLinearLayoutManager
. Es gibt zwei Fälle, die ich behandeln muss:RecyclerView
übergibt den Seitensprung zu einem internenScroller
welche dann führt das scrollen Magie. Dies ist problematisch, weil dann dieRecyclerView
meist siedelt sich in einem unsnapped position. Ich löse dieses durch überschreiben derRecyclerView
fling()
Umsetzung und statt schleudern, smoothscroll dieLinearLayoutManager
um eine position.onTouchEvent
Methode.Den
SnappyRecyclerView
:Schnittstelle für flottes layout-Manager:
Und hier ist ein Beispiel für eine
LayoutManager
dass Unterklassen dieLinearLayoutManager
zu einerLayoutManager
mit smooth-scrolling:InformationsquelleAutor der Antwort Catherine
Mit
LinearSnapHelper
, ist dies nun sehr einfach.Alles, was Sie tun müssen, ist dieses:
Es ist ganz einfach! Beachten Sie, dass
LinearSnapHelper
wurde Hinzugefügt, in der Bibliothek Unterstützt ab der version 24.2.0.Bedeutung Sie haben, fügen Sie diese, um Ihre app-Modul ist
build.gradle
InformationsquelleAutor der Antwort razzledazzle
Habe ich es geschafft, zu finden eine bessere Möglichkeit, dies zu tun. @Katharina (OP) lassen Sie mich wissen, wenn dies verbessert werden kann, oder Sie fühlen, ist eine Verbesserung über deins 🙂
Hier ist die scroll-Hörer, die ich benutze.
https://github.com/humblerookie/centerlockrecyclerview/
Habe ich weggelassen, einige kleinere Annahmen hier wie zB.
1) Erste und Letzte Polstern: die Ersten und letzten Elemente in der horizontalen scrollen müssen, haben die erste und Letzte Polstern jeweils so eingestellt, dass die ersten und letzten Ansichten in der Mitte, wenn gescrollt erste und Letzte beziehungsweise.ZB in der onBindViewHolder Sie könnte so etwas tun.
Die Logik ist prettty generische und man kann es für viele andere Fälle. Mein Fall ist der recycler Ansicht horizontal und erstreckt sich die gesamte horizontale Breite ohne Ränder( im Grunde recyclerview Mittelpunkt X-Koordinate ist der Bildschirm in der Mitte)oder unebenen Polster.
Incase jemand konfrontiert ist, Frage freundlich Kommentar.
InformationsquelleAutor der Antwort humblerookie
Brauchte ich auch einem Flotten recycler anzeigen. Ich möchte zulassen, dass die recycler Objekt-snap auf der linken Seite eine Spalte. Es endete mit der Implementierung einer SnapScrollListener, die ich auf der recycler-Ansicht. Das ist mein code:
SnapScrollListener:
Berechnung von snap:
Wenn die erste sichtbare Ansicht gescrollt wird mehr als die Hälfte der Breite aus dem Bildschirm heraus, wird die nächste Spalte sichtbar ist fangen auf der linken Seite.
Einstellung der Hörer:
InformationsquelleAutor der Antwort Thomas R.
Hier ist ein einfacher hack für das reibungslose scrollen zu einer bestimmten position auf einem Seitensprung Veranstaltung:
Überschreiben der Seitensprung-Methode mit einem Aufruf smoothScrollToPosition(int position), wo die "int " position" ist die position der Ansicht, die Sie wollen in den adapter. Sie müssen, um den Wert der position irgendwie, aber das ist abhängig von Ihren Bedürfnissen und Umsetzung.
InformationsquelleAutor der Antwort eDizzle
Nach Herumspielen mit RecyclerView für etwas, das ist, was ich kam mit, so weit und was ich mit der rechten jetzt. Es hat einen Schönheitsfehler, aber ich will nicht verschütten die Bohnen (noch) nicht, da Sie wahrscheinlich nicht bemerken.
https://gist.github.com/lauw/fc84f7d04f8c54e56d56
Es unterstützt nur horizontale recyclerviews und rastet in der Mitte und kann auch verkleinert werden auf der Grundlage, wie weit Sie von der Mitte. Verwenden Sie als Ersatz der RecyclerView.
Edit: 08/2016
Es ist in einem repository:
https://github.com/lauw/Android-SnappingRecyclerView
Ich werde nur zu halten, dies während der Arbeit auf eine bessere Umsetzung.
InformationsquelleAutor der Antwort Lauw
Einen sehr einfachen Ansatz für das erzielen einer snap-in-position-Verhalten -
Der einzige kleine Nachteil ist, dass es keinen snap rückwärts, wenn Sie einen Bildlauf weniger als die Hälfte Weg von der teilweise sichtbaren Zelle - aber wenn Sie das nicht stört Sie als es ist eine saubere und einfache Lösung.
InformationsquelleAutor der Antwort Nati Dykstein
Snap Scrollen ist Teil der Bibliothek unterstützt 24.2.0 jetzt
https://developer.android.com/topic/libraries/support-library/revisions.html
Verwandten Klassen :
https://developer.android.com/reference/android/support/v7/widget/SnapHelper.html
https://developer.android.com/reference/android/support/v7/widget/LinearSnapHelper.html
Folgende ist ein gutes Beispiel :
https://rubensousa.github.io/2016/08/recyclerviewsnap
InformationsquelleAutor der Antwort 3xplore
Implementierte ich eine funktionierende Lösung für die Horizontale Ausrichtung der RecyclerView, dass gerade liest Koordinaten onTouchEvent, auf den ersten zu BEWEGEN und auf BIS. BIS auf die Berechnung der position, die wir gehen müssen.
Funktioniert gut für mich, lassen Sie mich wissen, wenn etwas falsch ist.
InformationsquelleAutor der Antwort Michail L
Aktualisieren humblerookie Antwort:
Diese schriftrolle listener ist in der Tat effektiv für centerlocking
https://github.com/humblerookie/centerlockrecyclerview/
Aber hier ist ein einfacher Weg, um hinzuzufügen Polsterung am Anfang und Ende der recyclerview zum Zentrum seiner Elemente:
InformationsquelleAutor der Antwort Gomino
Wenn Sie brauchen, schnappen Unterstützung für start, Spitze, Ende oder unten, verwenden Sie GravitySnapHelper(https://github.com/rubensousa/RecyclerViewSnap/blob/master/app/src/main/java/com/github/rubensousa/recyclerviewsnap/GravitySnapHelper.java).
Einrasten center:
Einrasten start mit GravitySnapHelper:
Einrasten top mit GravitySnapHelper:
InformationsquelleAutor der Antwort PrakhaRaM
Ist und noch ein cleaner option ist die Verwendung von benutzerdefinierten
LayoutManager
,können Sie überprüfen
https://github.com/apptik/multiview/tree/master/layoutmanagers
Es ist in Entwicklung, aber funktioniert schon ganz gut.
Ein snapshot verfügbar ist:
https://oss.sonatype.org/content/repositories/snapshots/io/apptik/multiview/layoutmanagers/
Beispiel:
InformationsquelleAutor der Antwort djodjo
Ich benötigt etwas ein bisschen anders als alle der oben genannten Antworten.
Die wichtigsten Anforderungen waren:
RecyclerView
.LayoutManager
oderRecyclerView
. Nur einRecyclerView.OnScrollListener
, die wird dann befestigt, indemrecyclerView.addOnScrollListener(snapScrollListener)
. Dieser Weg, der code ist viel sauberer.Und zwei sehr spezifische Anforderungen, die sollte leicht zu ändern, im Beispiel unten, um zu passen zu Ihrem Fall:
RecyclerView
.Diese Lösung nutzt die native
LinearSmoothScroller
. Der Unterschied ist, dass im letzten Schritt, wenn die "Ziel-Ansicht" ist gefunden, es ändert sich die Berechnung des Versatzes, so dass es einrastet, um eine bestimmte position.InformationsquelleAutor der Antwort Michał K