Ich versuche, ein Layout zu implementieren, das RecyclerView und ScrollView im selben Layout enthält.
Layoutvorlage:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Probleme: Ich kann bis zum letzten Element von scrollen ScrollView
Dinge, die ich versucht habe:
- Kartenansicht innerhalb der
ScrollView
(jetztScrollView
enthältRecyclerView
) - kann die Karte bis zum sehenRecyclerView
- Der erste Gedanke war, dies
viewGroup
mit zu implementieren ,RecyclerView
anstattScrollView
wo einer seiner Ansichtstypen der ist,CardView
aber ich habe genau die gleichen Ergebnisse wie mit demScrollView
NestedScrollView
stattdessen, da es viele Bildlaufprobleme behandeltNestedScrollView
anstelle von aScrollView
. Genau dafür ist es.Antworten:
verwenden
NestedScrollView
stattScrollView
Weitere Informationen finden Sie im NestedScrollView-Referenzdokument .
und
recyclerView.setNestedScrollingEnabled(false);
zu Ihrem hinzufügenRecyclerView
quelle
android:layout_height="wrap_content"
für das Layout für ViewHolderNestedScrollView
bleibt mir im Gegensatz zumScrollView
. Suche nach einer Lösung ohne VerwendungNestedScrollView
Ich weiß, ich bin spät dran, aber das Problem besteht immer noch, auch nachdem Google das Problem behoben hat
android.support.v7.widget.RecyclerView
Das Problem , das ich jetzt bekommen , ist
RecyclerView
mitlayout_height=wrap_content
nicht Höhe aller Elemente Ausgabe nehmen innen ,ScrollView
dass nur geschieht auf Eibisch und Nougat + (API 23, 24, 25) Versionen.(UPDATE: Ersetzen
ScrollView
durchandroid.support.v4.widget.NestedScrollView
funktioniert bei allen Versionen. Ich habe es irgendwie verpasst, die akzeptierte Lösung zu testen . Dies wurde in meinem Github-Projekt als Demo hinzugefügt.)Nachdem ich verschiedene Dinge ausprobiert habe, habe ich eine Problemumgehung gefunden, die dieses Problem behebt.
Hier ist meine Layoutstruktur auf den Punkt gebracht:
Die Problemumgehung ist das Umschließen
RecyclerView
mitRelativeLayout
. Fragen Sie mich nicht, wie ich diese Problemumgehung gefunden habe !!!¯\_(ツ)_/¯
Ein vollständiges Beispiel finden Sie im GitHub- Projekt - https://github.com/amardeshbd/android-recycler-view-wrap-content
Hier ist ein Demo-Screencast, der das Update in Aktion zeigt:
quelle
Obwohl die Empfehlung, dass
Ist ein guter Rat, aber wenn Sie eine feste Höhe in der Recycler-Ansicht einstellen, sollte es gut funktionieren.
Wenn Sie die Höhe des Adapterelement-Layouts kennen, können Sie einfach die Höhe des RecyclerView berechnen.
quelle
adapterItemSize
Variable?Falls das Festlegen der festen Höhe für RecyclerView für jemanden (wie mich) nicht funktioniert hat, habe ich Folgendes zur Lösung für feste Höhe hinzugefügt:
quelle
Die neue Android Support Library 23.2 löst dieses Problem. Sie können jetzt wrap_content als Ihre Höhe festlegen
RecyclerView
und funktionieren ordnungsgemäß.Android Support Library 23.2
quelle
RecyclerViews können problemlos in ScrollViews eingefügt werden, solange sie nicht selbst scrollen. In diesem Fall ist es sinnvoll, eine feste Höhe festzulegen.
Die richtige Lösung besteht darin,
wrap_content
die RecyclerView-Höhe zu verwenden und dann einen benutzerdefinierten LinearLayoutManager zu implementieren, der die Umhüllung ordnungsgemäß handhaben kann.Kopieren Sie diesen LinearLayoutManager in Ihr Projekt: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Wickeln Sie dann die RecyclerView ein:
Und richten Sie es so ein:
Bearbeiten: Dies kann zu Komplikationen beim Scrollen führen, da RecyclerView die Berührungsereignisse von ScrollView stehlen kann. Meine Lösung bestand darin, die RecyclerView in allen Bereichen zu löschen und ein LinearLayout zu verwenden, Unteransichten programmgesteuert aufzublasen und sie dem Layout hinzuzufügen.
quelle
Für
ScrollView
, Sie könnten wie unten verwendenfillViewport=true
und machenlayout_height="match_parent"
und Recycler-Ansicht nach innen setzen:Keine weitere Höheneinstellung durch Code erforderlich.
quelle
RecyclerView
Die manuelle Berechnung der Höhe ist nicht gut, es ist besser, eine benutzerdefinierte zu verwendenLayoutManager
.Der Grund für die oben genannte Problem ist jede Ansicht , die es des Scroll hat (
ListView
,GridView
,RecyclerView
) konnte es in der Höhe berechnen , wenn Add als Kind in einer anderen Ansicht blättern hat. Das Überschreiben deronMeasure
Methode löst das Problem.Bitte ersetzen Sie den Standard-Layout-Manager durch den folgenden:
quelle
Versuche dies. Sehr späte Antwort. Aber sicherlich in Zukunft jedem helfen.
Stellen Sie Ihre Bildlaufansicht auf NestedScrollView ein
In Ihrem Recyclerview
quelle
UPDATE: Diese Antwort ist veraltet, da es Widgets wie NestedScrollView und RecyclerView gibt, die das verschachtelte Scrollen unterstützen.
Sie sollten niemals eine scrollbare Ansicht in eine andere scrollbare Ansicht einfügen!
Ich schlage vor, Sie erstellen Ihre Hauptlayout-Recycler-Ansicht und setzen Ihre Ansichten als Elemente der Recycler-Ansicht ein.
Schauen Sie sich dieses Beispiel an, in dem gezeigt wird, wie mehrere Ansichten im Recycler-Ansichtsadapter verwendet werden. Link zum Beispiel
quelle
Wenn Sie
RecyclerView
hineinsteckenNestedScrollView
und aktivierenrecyclerView.setNestedScrollingEnabled(false);
, funktioniert das Scrollen gut .Es gibt jedoch ein Problem
Zum Beispiel haben Ihre
RecyclerView
(innerhalbNestedScrollView
oderScrollView
) 100 Artikel.Beim
Activity
Start werden 100 Elemente erstellt (onCreateViewHolder
undonBindViewHolder
von 100 Elementen werden gleichzeitig aufgerufen).Beispiel: Für jedes Element laden Sie ein großes Bild aus der API => Aktivität erstellt -> 100 Bilder werden geladen.
Es macht die Startaktivität langsamer und verzögert.
Mögliche Lösung :
- Denken Sie über die Verwendung
RecyclerView
mit mehreren Typen nach.Wenn jedoch in Ihrem Fall, es gibt nur ein paar Artikel in
RecyclerView
und recyceln oder entsorge nicht nicht viel Einfluss auf die Leistung, können SieRecyclerView
innenScrollView
für einfachequelle
RecyclerView
Recycling nach dem Ablegen durchzuführenScrollView
. Wenn Sie recyceln möchten, denken Sie über einen anderen Ansatz nach (wie die Verwendung von RecyclerView mit mehreren Typen)Sie können diesen Weg entweder verwenden:
Fügen Sie diese Zeile Ihrer recycelView-XML-Ansicht hinzu:
Probieren Sie es aus, recyclerview wird reibungslos mit flexibler Höhe gescrollt
hoffe das hat geholfen.
quelle
Es scheint, dass
NestedScrollView
das Problem dadurch gelöst wird. Ich habe mit diesem Layout getestet:Und es funktioniert ohne Probleme
quelle
Ich habe CustomLayoutManager verwendet, um RecyclerView Scrolling zu deaktivieren. Verwenden Sie die Recycler-Ansicht auch nicht als WrapContent, sondern als 0dp, Weight = 1
Verwenden Sie CustomLayoutManager in RecyclerView:
UI XML:
quelle
Ich hatte das gleiche Problem. Das habe ich versucht und es funktioniert. Ich teile meinen XML- und Java-Code. Hoffe das wird jemandem helfen.
Hier ist die XML
Hier ist der zugehörige Java-Code. Es wirkt wie ein Zauber.
quelle
NestedScrollView
anstelle der BildlaufansichtDas macht den Trick:
quelle
Eigentlich ist der Hauptzweck der
RecyclerView
ist zu kompensierenListView
undScrollView
. Anstatt das zu tun, was Sie tatsächlich tun: EinRecyclerView
in einem zu habenScrollView
, würde ich vorschlagen, nur ein zu habenRecyclerView
, das mit vielen Arten von Kindern umgehen kann.quelle
Zuerst sollten Sie
NestedScrollView
statt verwendenScrollView
und dasRecyclerView
Innere setzenNestedScrollView
.Verwenden Sie die benutzerdefinierte Layoutklasse, um die Höhe und Breite des Bildschirms zu messen:
Und implementieren Sie den folgenden Code in die Aktivität / das Fragment von
RecyclerView
:quelle
Wenn RecyclerView nur eine Zeile in ScrollView anzeigt. Sie müssen nur die Höhe Ihrer Zeile auf einstellen
android:layout_height="wrap_content"
.quelle
Sie können LinearLayoutManager auch überschreiben, damit die Recycling-Ansicht reibungslos funktioniert
quelle
Es tut mir leid, dass ich zu spät zur Party komme, aber es scheint, als gäbe es eine andere Lösung, die für den von Ihnen erwähnten Fall perfekt funktioniert.
Wenn Sie eine Recycler-Ansicht in einer Recycler-Ansicht verwenden, scheint dies einwandfrei zu funktionieren. Ich habe es persönlich versucht und benutzt, und es scheint überhaupt keine Langsamkeit und kein Ruckeln zu geben. Jetzt bin ich mir nicht sicher, ob dies eine gute Vorgehensweise ist oder nicht, aber das Verschachteln mehrerer Recycler-Ansichten, selbst verschachtelte Bildlaufansichten, verlangsamt sich. Aber das scheint gut zu funktionieren. Bitte probieren Sie es aus. Ich bin mir sicher, dass das Verschachteln damit vollkommen in Ordnung sein wird.
quelle
Ein anderer Ansatz zur Behebung des Problems besteht darin,
ConstraintLayout
Folgendes zu verwendenScrollView
:Aber ich würde mich immer noch an den
androidx.core.widget.NestedScrollView
von Yang Peiyong vorgeschlagenen Ansatz halten .quelle
** Lösung, die bei mir funktioniert hat
Verwenden Sie NestedScrollView mit der Höhe als wrap_content
// Dein Zeileninhalt geht hier
quelle