Wie benutzt man RecyclerView
drinnen NestedScrollView
?
RecyclerView
Inhalt ist nach dem Einstellen des Adapters nicht sichtbar.
UPDATE- Layoutcode aktualisiert.
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_1">
</RelativeLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
<android.support.v7.widget.RecyclerView
android:id="@+id/conversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Antworten:
Ersetzen Sie Ihre recyclerView durch,
Hier,
wird den Rest der Dinge verwalten.
Außerdem müssen Sie Ihre recyclerView nicht in NestedScrollView ablegen
quelle
NestedScrollView
sondern nur mit erreichtapp:layout_behavior="@string/appbar_scrolling_view_behavior"
. Das ist der Schlüssel!CoordinatorLayout
,AppBarLayout
und entsprechende Einstellunglayout_scrollFlags
auf der untergeordneten Ansicht (n) , die mit dem gescrollt werden sollRecyclerView
. Ich bin mir nicht sicher, warum dies in der Antwort weggelassen wurde. Ansonsten ist dies eine schöne und einfache Lösung.UPDATE 1
Seit Android Support Library 23.2.0 wurden Methoden
setAutoMeasureEnabled(true)
für LayoutManager hinzugefügt . Dadurch kann RecyclerView den Inhalt verpacken und wirkt wie ein Zauber.http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
Fügen Sie einfach so etwas hinzu:
UPDATE 2
Da 27.1.0
setAutoMeasureEnabled
veraltet ist, sollten Sie die benutzerdefinierte Implementierung von LayoutManager mit überschriebener Methode bereitstellenisAutoMeasureEnabled()
Nach vielen Fällen der Verwendung von RecyclerView empfehle ich jedoch dringend, es nicht im Wrapping-Modus zu verwenden , da dies nicht der Zweck ist. Versuchen Sie, Ihr gesamtes Layout mit normaler RecyclerView mit mehreren Elementtypen neu zu gestalten. Oder verwenden Sie den Ansatz mit LinearLayout, den ich unten als letzten Ausweg beschrieben habe
Alte Antwort (nicht empfohlen)
Sie können
RecyclerView
innen verwendenNestedScrollView
. Zuallererst sollten Sie Ihre eigene Gewohnheit implementierenLinearLayoutManager
, damit SieRecyclerView
den Inhalt einpacken können. Beispielsweise:Danach verwenden Sie dies
LayoutManager
für IhreRecyclerView
Sie sollten diese beiden Methoden aber auch aufrufen:
Hier
setNestedScrollingEnabled(false)
deaktivieren Scrollen fürRecyclerView
, so dass es nicht abfangen Scrollen Ereignis ausNestedScrollView
. Und stellen SiesetHasFixedSize(false)
fest, dass Änderungen am Adapterinhalt die Größe des ändern könnenRecyclerView
Wichtiger Hinweis: Diese Lösung ist in einigen Fällen wenig fehlerhaft und weist Probleme mit der Leistung auf. Wenn Sie also viele Elemente in Ihrem Programm haben, würde
RecyclerView
ich empfehlen, eine benutzerdefinierteLinearLayout
Implementierung der Listenansicht zu verwenden , ein Analogon des Adapters dafür zu erstellen und es zu erstellen benimm dich wieListView
oderRecyclerView
quelle
RecyclerView
.1) Sie müssen die Support-Bibliothek 23.2.0 (oder) oben verwenden
2) und
RecyclerView
Höhe wird seinwrap_content
.3)
recyclerView.setNestedScrollingEnabled(false)
Auf diese Weise funktioniert das Recycler-Muster jedoch nicht . (dh alle Ansichten werden auf einmal geladen, da
wrap_content
die Höhe vollständig sein muss,RecyclerView
damit alleViews at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to use
untergeordneten Ansichten gezeichnet werden. Typand add all other views that need to scroll to
RecyclerViewrather than using
RecyclerViewin
Scrollview`. Die Auswirkungen auf die Leistung sind sehr hoch.Um es einfach zu machen "es verhält sich einfach wie
LinearLayout
bei allen untergeordneten Ansichten"quelle
recyclerView.setNestedScrollingEnabled(false)
hat mir geholfen, eine glatte Schriftrolle zu haben.Sie können verwenden
android:fillViewport="true"
, um die zuNestedScrollView
messenRecyclerView
. DasRecyclerView
füllt die verbleibende Höhe. also , wenn Sie die blättern möchtenNestScrollView
, können Sie die SetRecyclerView
‚sminHeight
.quelle
Einfach
recyclerView.setNestedScrollingEnabled(false);
vor sichsetAdapter
selbst hinzuzufügen hat bei mir funktioniert. Ich habeapp:layout_behavior="@string/appbar_scrolling_view_behavior"
nirgendwo etwas hinzugefügt und keinen benutzerdefinierten Layout-Manager festgelegtquelle
Das ist es, was für mich funktioniert
quelle
Es gibt einen einfachen und testenden Code, den Sie überprüfen können
quelle
Denn
androidx
es heißtandroidx.core.widget.NestedScrollView
- und es scrollt auch Butter mit EigenschaftenisScrollContainer
undmeasureAllChildren
aktiviert:quelle
Versuchen Sie, diese Bibliothek zu verwenden - https://github.com/serso/android-linear-layout-manager .
Mit dem LayoutManager der Bibliothek wird der Inhalt von RecyclerView umbrochen. In diesem Fall ist RecyclerView "so groß wie innere Ansichten", hat also keine Bildlaufleisten und der Benutzer verwendet die Bildlauffunktionen von NestedScrollView. Daher ist es nicht mehrdeutig wie "scrollbar inside scrollable".
quelle
Hier ist der Code, den ich verwende, um Bildlaufprobleme zu vermeiden:
quelle
Ich habe RecyclerView in einem NestedScrollView verwendet und es hat bei mir funktioniert. Das einzige Problem, an das ich denken musste, war, dass eine NestedScrollView nur eine untergeordnete Ansicht enthält. In meinem Fall habe ich also die LienearLayout-Ansichtsgruppe verwendet, in der sich meine RecyclerView sowie eine Reihe anderer Ansichten befanden, die ich benötigte.
Ich habe ein Problem beim Einfügen meiner RecyclerView in die NestedScrollView. Ich stellte fest, dass das Scrollen des Inhalts meines RecyclerView nachließ.
Später stellte ich fest, dass mein RecyclerView das Bildlaufereignis empfing und daher mit dem Bildlaufverhalten von NestedScrollView in Konflikt stand.
Um dieses Problem zu lösen, musste ich die Bildlauffunktion meines RecyclerView mit dieser Methode deaktivieren
movieListNewRecyclerView.setNestedScrollingEnabled(false);
Auf meinem Instagram kannst du ein kurzes Video von dem sehen, was ich tatsächlich getan habe. Dies ist mein Instagram-Handle von elix03
Klicken Sie auf dieses Bild, um zu sehen, was ich getan habe
quelle
Ich habe Viewpager und RecyclerView in der NestedScrollView. Nach dem Hinzufügen der folgenden Zeilen
Ich habe das Problem des langsamen Bildlaufs und der Bildlaufverzögerung gelöst.
quelle
recyclerView.setHasFixedSize(true);
?Sie können keine Recycler-Ansicht in einer verschachtelten Bildlaufansicht verwenden. Es ist nicht beabsichtigt, weitere scrollbare Ansichten zu enthalten, aber da es sich um ein untergeordnetes Bildlauflayout handelt, benötigen Sie die verschachtelte Bildlaufansicht. Ich hatte das gleiche Problem, aber am Ende habe ich meine Textansicht in eine Kopfansicht innerhalb der Recyclingansicht verschoben, die Recyclingansicht zu einem direkten untergeordneten Element des Koordinatorlayouts gemacht und die verschachtelte Bildlaufansicht gelöscht. Dann waren alle meine Probleme weg.
quelle
RecyclerView
GeräteNestedScrollingChild
,RecyclerView
sollte über gescrollt werden könnenNestedScrollView
.Wenn Sie
RecyclerView-23.2.1
oder später verwenden. Die folgende Lösung funktioniert einwandfrei:Fügen Sie in Ihrem Layout RecyclerView folgendermaßen hinzu:
Und in Ihrer Java-Datei:
Hier
layoutManager.setAutoMeasureEnabled(true);
wird der Trick machen.Weitere Informationen finden Sie in diesem Problem und in diesem Entwicklerblog .
quelle
Eine Lösung, um die Recyclingfunktion der Recyclingansicht beizubehalten und zu vermeiden, dass die Recyclingansicht alle Ihre Daten lädt, besteht darin, eine feste Höhe in der Recyclingansicht selbst festzulegen. Auf diese Weise kann die Recycling-Ansicht nur so viel geladen werden, wie die Höhe dem Benutzer anzeigen kann, sodass das Element recycelt wird, wenn Sie jemals nach unten / oben scrollen.
quelle
Es gibt viele gute Antworten. Der Schlüssel ist , dass Sie setzen müssen
nestedScrollingEnabled
zufalse
. Wie oben erwähnt, können Sie dies in Java-Code tun:Sie haben aber auch die Möglichkeit, dieselbe Eigenschaft in xml code (
android:nestedScrollingEnabled="false"
) festzulegen :quelle
Wenn Sie RecyclerView ScrollListener in NestedScrollView verwenden , funktioniert der Listener addOnScrollListener nicht ordnungsgemäß, wenn Sie beide verwenden.
Verwenden Sie diesen Code.
Dieser Code funktioniert einwandfrei RecyclerView ScrollListener in NestedScrollView .
Vielen Dank
quelle
Ich musste CoordinatorLayout mit Bildlauf in der Symbolleiste implementieren und es dauerte nur den ganzen Tag, bis ich damit herumgespielt hatte. Ich habe es funktioniert, indem ich NestedScrollView überhaupt entfernt habe. Ich verwende also nur RelativeLayout im Stammverzeichnis.
quelle
Verwenden Sie recyclerView nicht in NestedScrollView. Dies kann zu Kaskadenproblemen führen! Ich schlage vor, ItemViewTypes in RecyclerView für die Verarbeitung mehrerer Arten von Ansichten zu verwenden. Fügen Sie einfach eine RecyclerView mit der Breite und Höhe von match_parent hinzu. Überschreiben Sie dann in Ihrem recyclerViewAdapter getItemViewType und verwenden Sie position, um zu handhaben, welches Layout aufgeblasen werden soll. Danach können Sie Ihren Ansichtshalter mit der onBindViewHolder-Methode behandeln.
quelle
quelle
Ich habe diese fantastische Erweiterung verwendet (geschrieben in Kotlin, kann aber auch in Java verwendet werden)
https://github.com/Widgetlabs/expedition-nestedscrollview
Grundsätzlich erhalten Sie das
NestedRecyclerView
Innere eines jeden Pakets, sagen wir Utils in Ihrem Projekt, und erstellen dann einfach Ihre Recycling-Ansicht wieSchauen Sie sich diesen großartigen Artikel von Marc Knaup an
https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a
quelle
Vorteile:
Fix:
quelle
RecyclerView mit NestedScrollView
quelle