Ich versuche hier mit RecyclerView eine karussellartige Ansicht zu erstellen. Ich möchte, dass das Element beim Scrollen einzeln in der Mitte des Bildschirms einrastet. Ich habe es versuchtrecyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);
Aber die Ansicht rollt immer noch reibungslos. Ich habe auch versucht, meine eigene Logik mit dem Scroll-Listener wie folgt zu implementieren:
recyclerView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
Log.v("Offset ", recyclerView.getWidth() + "");
if (newState == 0) {
try {
recyclerView.smoothScrollToPosition(layoutManager.findLastVisibleItemPosition());
recyclerView.scrollBy(20,0);
if (layoutManager.findLastVisibleItemPosition() >= recyclerView.getAdapter().getItemCount() - 1) {
Beam refresh = new Beam();
refresh.execute(createUrl());
}
} catch (Exception e) {
e.printStackTrace();
}
}
Das Wischen von rechts nach links funktioniert jetzt einwandfrei, aber nicht umgekehrt. Was vermisse ich hier?
quelle
LinearLayoutManager
bei der alle Ansichten normal groß waren. Nichts anderes als das obige Snippet wird benötigt.LinearSnapHelper
.Google I / O 2019 Update
ViewPager2 ist da!
Google hat gerade beim Vortrag "Was ist neu in Android" (auch bekannt als "The Android Keynote") angekündigt , dass sie an einem neuen ViewPager arbeiten, der auf RecyclerView basiert!
Von den Folien:
Sie können die neueste Version überprüfen hier und die Release Notes hier . Es gibt auch eine offizielle Probe .
Persönliche Meinung: Ich denke, dies ist eine wirklich notwendige Ergänzung. Ich hatte in letzter Zeit große Probleme mit dem
PagerSnapHelper
oszillierenden Links-Rechts auf unbestimmte Zeit - siehe das Ticket, das ich geöffnet habe.Neue Antwort (2016)
Sie können jetzt einfach einen SnapHelper verwenden .
Wenn Sie ein zentriertes Ausrichtungsverhalten ähnlich ViewPager wünschen, verwenden Sie PagerSnapHelper :
Es gibt auch einen LinearSnapHelper . Ich habe es versucht und wenn du mit Energie fliegst, rollt es 2 Gegenstände mit 1 Schleuder. Persönlich hat es mir nicht gefallen, aber ich entscheide einfach selbst - es dauert nur Sekunden.
Ursprüngliche Antwort (2016)
Nachdem ich viele Stunden lang 3 verschiedene Lösungen ausprobiert habe, die hier in SO gefunden wurden, habe ich endlich eine Lösung entwickelt, die das Verhalten in a sehr genau nachahmt
ViewPager
.Die Lösung basiert auf der @ eDizzle- Lösung , die ich meiner Meinung nach so weit verbessert habe, dass sie fast wie eine funktioniert
ViewPager
.Wichtig: Die
RecyclerView
Breite meiner Artikel entspricht genau der des Bildschirms. Ich habe es nicht mit anderen Größen versucht. Auch ich benutze es mit einer HorizontalenLinearLayoutManager
. Ich denke, dass Sie den Code anpassen müssen, wenn Sie einen vertikalen Bildlauf wünschen.Hier haben Sie den Code:
Genießen!
quelle
Wenn das Ziel darin besteht,
RecyclerView
das Verhalten zu imitieren,ViewPager
ist dies ein recht einfacher AnsatzDurch die Verwendung
PagerSnapHelper
können Sie das Verhalten wie erhaltenViewPager
quelle
LinearSnapHelper
stattPagerSnapHelper
und es funktioniert für michLinearSnapHelper
LinearSnapHelper
, und es schnappt nach einem mittleren Gegenstand.PagerSnapHelper
behindert das einfache Scrollen (zumindest eine Liste von Bildern).Sie müssen findFirstVisibleItemPosition verwenden, um in die entgegengesetzte Richtung zu gehen. Und um festzustellen, in welche Richtung sich der Schlag befand, müssen Sie entweder die Schleudergeschwindigkeit oder die Änderung von x ermitteln. Ich habe dieses Problem aus einem etwas anderen Blickwinkel angegangen als Sie.
Erstellen Sie eine neue Klasse, die die RecyclerView-Klasse erweitert, und überschreiben Sie dann die Fling-Methode von RecyclerView wie folgt:
quelle
Fügen Sie einfach hinzu
padding
undmargin
zurecyclerView
undrecyclerView item
:recyclerView-Artikel:
recyclerView:
und setzen
PagerSnapHelper
:dp bis px:
Ergebnis:
quelle
Meine Lösung:
Ich übergebe diesen Layout-Manager an RecycledView und stelle den Versatz ein, der zum Zentrieren von Elementen erforderlich ist. Alle meine Artikel haben die gleiche Breite, daher ist ein konstanter Versatz in Ordnung
quelle
PagerSnapHelper
funktioniert nichtGridLayoutManager
mit spanCount> 1, daher lautet meine Lösung unter diesen Umständen:quelle