Ich verwende das neue CoordinatorLayout mit AppBarLayout und CollapsingToolbarLayout. Unter AppBarLayout befindet sich eine RecyclerView mit einer Inhaltsliste.
Ich habe überprüft, ob das Scrollen in der RecyclerView funktioniert, wenn ich in der Liste nach oben und unten scrolle. Ich möchte jedoch auch, dass das AppBarLayout während der Erweiterung reibungslos scrollt.
Wenn Sie nach oben scrollen, um das CollaspingToolbarLayout zu erweitern, wird der Bildlauf sofort beendet, sobald Sie Ihren Finger vom Bildschirm heben. Wenn Sie in einer schnellen Bewegung nach oben scrollen, wird das CollapsingToolbarLayout manchmal auch wieder reduziert. Dieses Verhalten mit RecyclerView scheint ganz anders zu funktionieren als bei Verwendung von NestedScrollView.
Ich habe versucht, verschiedene Bildlaufeigenschaften in der Recyclingansicht festzulegen, konnte dies jedoch nicht herausfinden.
Hier ist ein Video, das einige Probleme beim Scrollen zeigt. https://youtu.be/xMLKoJOsTAM
Hier ist ein Beispiel, das das Problem mit RecyclerView (CheeseDetailActivity) zeigt. https://github.com/tylerjroach/cheesesquare
Hier ist das ursprüngliche Beispiel, das eine NestedScrollView von Chris Banes verwendet. https://github.com/chrisbanes/cheesesquare
Antworten:
Die Antwort von Kirill Boyarshinov war fast richtig.
Das Hauptproblem besteht darin, dass die RecyclerView manchmal eine falsche Schleuderrichtung angibt. Wenn Sie also den folgenden Code zu seiner Antwort hinzufügen, funktioniert dies ordnungsgemäß:
Ich hoffe das hilft.
quelle
if (target instanceof SwipeRefreshLayout && velocityY < 0) { target = ((SwipeRefreshLayout) target).getChildAt(0); }
beforeif (target instanceof RecyclerView && velocityY < 0) {
Scheint, dass das
v23
Update es noch nicht behoben hat.Ich habe eine Art Hack gefunden, um das Problem zu beheben. Der Trick besteht darin, das Fling-Ereignis wieder aufzunehmen, wenn sich das oberste untergeordnete Element von ScrollingView nahe am Datenanfang in Adapter befindet.
Verwenden Sie es in Ihrem Layout wie folgt:
BEARBEITEN : Die Wiederaufnahme des Fling-Ereignisses basiert jetzt auf
verticalScrollOffset
der Anzahl der Elemente von oben aufRecyclerView
.EDIT2: Überprüfen Sie das Ziel als
ScrollingView
Schnittstelleninstanz anstelle vonRecyclerView
. BeidesRecyclerView
undNestedScrollingView
implementieren.quelle
verticalScrollOffset
sie allgemeiner zu verwenden. Jetzt wird das Schleuderereignis wieder aufgenommen, wennrecyclerView
nach oben gescrollt wird.target instanceof RecyclerView
zutarget instanceof NestedScrollView
oder mehr für generischen Fall zutarget instanceof ScrollingView
. Ich habe die Antwort aktualisiert.Ich habe das Update gefunden, indem ich OnScrollingListener auf die recyclerView angewendet habe. jetzt funktioniert es sehr gut. Das Problem ist, dass recyclerview den falschen verbrauchten Wert bereitgestellt hat und das Verhalten nicht weiß, wann die recyclerview nach oben gescrollt wird.
quelle
CoordinatorLayout
undViewPager
Setup, vielen Dank für diese am meisten erwartete Lösung. Bitte schreiben Sie ein GIST dafür, damit auch andere Entwickler davon profitieren können. Ich teile diese Lösung auch. Danke noch einmal.Es wurde seit dem Support-Design 26.0.0 behoben.
quelle
Dies ist eine reibungslose Version von Google Support Design AppBarLayout. Wenn Sie AppBarLayout verwenden, wissen Sie, dass es ein Problem mit dem Schleudern gibt.
Siehe Bibliothek hier .. https://github.com/henrytao-me/smooth-app-bar-layout
quelle
Es ist ein Recyclerview-Fehler. Es soll in v23.1.0 behoben sein.
Schauen Sie unter https://code.google.com/p/android/issues/detail?id=177729 nach
quelle
v26.0.1
!Dies ist mein Layout und die Schriftrolle. Es funktioniert so, wie es sollte.
quelle
Meine bisherige Lösung basiert auf den Antworten von Mak Sing und Manolo Garcia .
Es ist nicht ganz perfekt. Im Moment weiß ich nicht, wie ich eine Validgeschwindigkeit neu berechnen soll, um einen seltsamen Effekt zu vermeiden: Die App-Leiste kann schneller als die Bildlaufgeschwindigkeit erweitert werden. Der Status mit einer erweiterten App-Leiste und einer gescrollten Recycler-Ansicht kann jedoch nicht erreicht werden.
quelle
Field viewFlingerField = recyclerView.getClass().getDeclaredField("mViewFlinger"); viewFlingerField.setAccessible(true); Object flinger = viewFlingerField.get(recyclerView); Field scrollerField = flinger.getClass().getDeclaredField("mScroller"); scrollerField.setAccessible(true); ScrollerCompat scroller = (ScrollerCompat) scrollerField.get(flinger); velocity = Math.signum(mVelocity) * Math.abs(scroller.getCurrVelocity());
In meinem Fall bekam ich das Problem, wo das Schleudern der
RecyclerView
nicht reibungslos und es stecken blieb.Das lag daran, dass ich
RecyclerView
NestedScrollView
aus irgendeinem Grund vergessen hatte, dass ich meine in eine .Es ist ein dummer Fehler, aber ich habe eine Weile gebraucht, um es herauszufinden ...
quelle
Ich füge eine Ansicht mit einer Höhe von 1 dp im AppBarLayout hinzu und dann funktioniert es viel besser. Das ist mein Layout.
quelle
Hier gibt es bereits einige ziemlich beliebte Lösungen, aber nachdem ich mit ihnen gespielt habe, habe ich eine einfachere Lösung gefunden, die für mich gut funktioniert hat. Meine Lösung stellt auch sicher, dass die
AppBarLayout
nur erweitert wird, wenn der scrollbare Inhalt die Spitze erreicht, ein Vorteil gegenüber anderen Lösungen hier.quelle
Die akzeptierte Antwort funktionierte nicht für mich, weil ich
RecyclerView
in aSwipeRefreshLayout
und a hatteViewPager
. Dies ist die verbesserte Version, die eineRecyclerView
in der Hierarchie sucht und für jedes Layout funktionieren sollte:quelle
Antwort: Es ist in der Support-Bibliothek v26 behoben
aber v26 hat ein Problem beim Schleudern. Manchmal springt AppBar wieder zurück, auch wenn das Schleudern nicht zu schwer ist.
Wie entferne ich den Bouncing-Effekt in der Appbar?
Wenn beim Aktualisieren auf Support 26 das gleiche Problem auftritt, finden Sie hier eine Zusammenfassung dieser Antwort .
quelle
Julian Os hat recht.
Die Antwort von Manolo Garcia funktioniert nicht, wenn die Recycling-Ansicht unter dem Schwellenwert liegt und gescrollt wird. Sie müssen die Position
offset
des Recyclerview und dievelocity to the distance
Position des Artikels vergleichen.Ich habe eine Java-Version erstellt, indem ich mich auf Julians Kotlin-Code bezogen und die Reflexion subtrahiert habe.
quelle
BaseApplication
Ich habe das Update von Eniz Bilgin https://stackoverflow.com/a/45090239/7639018 gefunden
Das Problem wurde mit den Bibliotheken in diesem Repository behoben.
( https://developer.android.com/topic/libraries/support-library/setup.html )
quelle
In Bezug auf den Google Issue Tracker wurde dies mit der Android 26.0.0-Beta2-Version der Support-Bibliothek behoben
Bitte aktualisieren Sie Ihre Android-Support-Bibliothek Version 26.0.0-beta2.
Wenn ein Problem weiterhin besteht, melden Sie es bitte im Google Issue Tracker , der zur Überprüfung erneut geöffnet wird.
quelle
Das Hinzufügen einer weiteren Antwort hier, da die oben genannten entweder meine Anforderungen nicht vollständig erfüllten oder nicht sehr gut funktionierten. Dieser basiert teilweise auf Ideen, die hier verbreitet werden.
Also, was macht dieser?
Szenario nach unten schleudern: Wenn das AppBarLayout reduziert ist, kann das RecyclerView von selbst geschleudert werden, ohne etwas zu tun. Andernfalls wird das AppBarLayout reduziert und verhindert, dass RecyclerView seinen Fling ausführt. Sobald es reduziert ist (bis zu dem Punkt, den die angegebene Geschwindigkeit erfordert) und wenn noch Geschwindigkeit übrig ist, wird das RecyclerView mit der ursprünglichen Geschwindigkeit abzüglich dessen, was das AppBarLayout gerade verbraucht hat, geschleudert.
Szenario nach oben schleudern: Wenn der Bildlaufversatz des RecyclerView nicht Null ist, wird er mit der ursprünglichen Geschwindigkeit geschleudert. Sobald dies abgeschlossen ist und noch Geschwindigkeit vorhanden ist (dh die RecyclerView wird auf Position 0 gescrollt), wird das AppBarLayout bis zu dem Punkt erweitert, an dem die ursprüngliche Geschwindigkeit abzüglich der gerade verbrauchten Anforderungen. Andernfalls wird das AppBarLayout bis zu dem Punkt erweitert, den die ursprüngliche Geschwindigkeit erfordert.
AFAIK, das ist das indended Verhalten.
Es gibt viel Nachdenken und es ist ziemlich üblich. Es wurden jedoch noch keine Probleme gefunden. Es ist auch in Kotlin geschrieben, aber es sollte kein Problem sein, es zu verstehen. Sie können das IntelliJ Kotlin-Plugin verwenden, um es zu Bytecode zu kompilieren -> und es zurück zu Java zu dekompilieren. Um es zu verwenden, platzieren Sie es im android.support.v7.widget-Paket und legen Sie es als CoordinatorLayout.LayoutParams-Verhalten von AppBarLayout im Code fest (oder fügen Sie den entsprechenden XML-Konstruktor oder etwas hinzu).
quelle
Das ist meine Lösung in meinem Projekt.
Stoppen Sie einfach den mScroller, wenn Sie Action_Down erhalten
xml:
FixAppBarLayoutBehavior.java:
quelle
für androidx,
Wenn Ihre Manifestdatei eine Zeile für android: hardwareAccelerated = "false" enthält, löschen Sie diese.
quelle