Ich habe ein Android-Layout, das scrollView
eine Reihe von Elementen enthält. Am Ende der habe scrollView
ich einelistView
die dann von einem Adapter bestückt wird.
Das Problem, das ich habe, ist, dass Android das listView
von der ausschließt, scrollView
da das scrollView
bereits eine scrollbare Funktion hat. Ich will daslistView
, dass das so lange ist, wie der Inhalt ist, und dass die Master-Bildlaufansicht scrollbar ist.
Wie kann ich dieses Verhalten erreichen?
Hier ist mein Hauptlayout:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >
<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
Anschließend füge ich meine Komponenten programmgesteuert mit der ID: zur linearen Schicht hinzu foodItemActvity_linearLayout_fragments
. Unten finden Sie eine der Ansichten, die in dieses lineare Layout geladen werden. Dies ist derjenige, der mir Probleme mit den Schriftrollen macht.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Mein Adapter füllt dann diese Listenansicht aus.
Hier ist ein Bild aus dem Android Hierarchie Viewer, wenn ich auf die Master ScrollView klicke:
Wie Sie sehen können, wird die Bewertungsliste "ViewView" ausgeschlossen.
Ich sollte in der Lage sein, die Seite nach unten zu scrollen und 8 Bewertungen zu sehen, aber stattdessen werden mir nur diese 3 angezeigt, und ich kann auf dem winzigen Teil scrollen, auf dem sich die Bewertungen befinden. Ich möchte einen globalen Bildlauf
quelle
Antworten:
Die kürzeste und einfachste Lösung für ChildView, um in einer ScrollView zu scrollen . Alles wie ListView, RecyclerView usw. Sie müssen im Code nichts Besonderes tun.
Ersetzen Sie einfach ScrollView durch android.support.v4.widget.NestedScrollView in Ihrer aktuellen XML und dann passiert Magie.
Unten finden Sie einen XML-Beispielcode:
Jetzt können Sie all die hässlichen Hacks loswerden, die wir gemacht haben, um dieses verschachtelte Scrollen zu umgehen.
Es ist Zeit zu spielen. Hölle Yeeeeeeeeeeeeeeeeeah!
quelle
requestLayout()
- setLayoutParams-Methode macht es bereits.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
Die Antwort ist einfach und ich bin überrascht, dass sie hier noch nicht beantwortet wurde.
Verwenden Sie ein
Header View
oder / undFooter View
in der Liste. Mischen Sie nicht aScrollView
mit aListView
oder irgendetwas, das scrollen kann. Es soll mit Kopf- und Fußzeilen verwendet werden :)Nehmen Sie im Wesentlichen den gesamten Inhalt über Ihrer ListView, fügen Sie ihn als Layout in eine andere XML-Datei ein, blasen Sie ihn dann im Code auf und fügen Sie ihn als Header-Ansicht zur Liste hinzu.
dh
quelle
Ich weiß, es ist so lange her, aber ich habe auch dieses Problem, habe diese Lösung ausprobiert und es funktioniert. Ich denke, es kann auch den anderen helfen.
Ich füge android hinzu: fillViewport = "true" in der Layout-XML für die scrollView. Insgesamt wird mein ScrollView also so sein.
Und es funktioniert für mich wie Magie. Die ListView, die sich in meiner ScrollView befindet, wird wieder auf ihre Größe erweitert.
Hier ist der vollständige Beispielcode für ScrollView und ListView.
quelle
Sie erstellen eine benutzerdefinierte Listenansicht, die nicht scrollbar ist
In Ihrer Layout-Ressourcendatei
In einer Java-Datei Erstellen Sie ein Objekt Ihrer customListview anstelle von ListView wie folgt : NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
quelle
Sie können diesen Code für die Listenansicht in der Bildlaufansicht verwenden
quelle
ListView
innenRecyclerView
, um mehr als das erste Element anzuzeigen.Sie können es lösen, indem Sie es
android:fillViewport="true"
zu Ihrer ScrollView hinzufügen.Vor der Verwendung dieser Eigenschaft war nur ein untergeordnetes Element meiner Listenansicht sichtbar. Nach dieser Verwendung sind alle Zeilen oder untergeordneten Elemente der Liste sichtbar.
quelle
Tun Sie nichts in Parent ScrollView. Tun Sie dies nur für die untergeordnete ListView. Alles wird perfekt funktionieren.
quelle
Dieser Code löst Ihr Problem, wenn Sie nur eine ListView in einem Code implementiert haben.
Wenn Sie RelativeLayout als untergeordnetes ListView- Element verwenden, gibt dieser Code hier eine NullPointerException zurück. ListItem.measure (0, 0); Und die Lösung besteht darin, Ihr Relativelayout in ein LinearLayout zu integrieren, und es funktioniert einwandfrei.
quelle
Ich werde es hier lassen, falls jemand das gleiche Problem hat. Ich musste eine ListView in eine ScrollView einfügen. ListView mit Header war aus mehreren Gründen keine Option. Es gab auch keine Möglichkeit, LinearLayout anstelle von ListView zu verwenden. Also folgte ich der akzeptierten Lösung, aber es funktionierte nicht, da die Elemente in der Liste ein komplexes Layout mit mehreren Zeilen hatten und jedes Listenansichtselement eine variable Höhe hatte. Die Höhe wurde nicht richtig gemessen. Die Lösung bestand darin, jedes Element in der getView () -Methode des ListView-Adapters zu messen.
quelle
Sie können ListView einfach in ScrollView einfügen! Sie müssen die Höhe von ListView nur programmgesteuert wie folgt ändern :
Das funktioniert perfekt!
quelle
Fertig nach viel F & E:
fragment_one.xml sollte folgendermaßen aussehen:
Ihre Java-Klasse von FragmentOne.java sieht folgendermaßen aus:
onCreateView
quelle
Ich hatte ein ähnliches Problem wie das Originalplakat - wie man die Listenansicht in der Bildlaufansicht scrollen lässt - und diese Antwort löste mein Problem. Deaktivieren Sie das Scrollen einer in einer ScrollView enthaltenen ListView
Ich habe keine neuen Fragmente in vorhandene Layouts oder ähnliches aufgerufen, wie es das OP tat, also würde mein Code ungefähr so aussehen:
Grundsätzlich überprüfe ich die Länge der Listenansicht, bevor ich sie aufrufe, und wenn ich sie aufrufe, mache ich sie in diese Länge. Verwenden Sie in Ihrer Java-Klasse diese Funktion:
Und rufen Sie die Funktion folgendermaßen auf:
Das Ergebnis ist eine Listenansicht ohne Bildlaufleiste, wobei die gesamte Länge der Listenansicht angezeigt wird und mit der Bildlaufleiste der Bildlaufansicht gescrollt wird.
quelle
Wie bereits erwähnt, verwenden Sie ListView nicht in einer ScrollView.
Um dies zu umgehen, können Sie ein LinearLayout verwenden, aber um die Dinge trotzdem sauber zu halten - füllen Sie Ihr LinearLayout mit einem Adapter, genau wie Sie es mit einer ListView tun
Sie können diese Klasse als LinearLayout-Ersatz verwenden, der Adapter unterstützt
quelle
Sie können alles in ein lineares Layout setzen. Das heißt, erstellen Sie ein lineares Layout und es hat 2 untergeordnete Elemente, eine Bildlaufansicht und ein weiteres lineares Layout. Geben Sie ihnen Layoutgewichte und los geht's:
quelle
Sie sollten niemals eine ScrollView mit einer ListView verwenden, da ListView sich um das eigene vertikale Scrollen kümmert. Dies führt vor allem dazu, dass alle wichtigen Optimierungen in ListView für den Umgang mit großen Listen zunichte gemacht werden, da ListView effektiv gezwungen wird, die gesamte Liste der Elemente anzuzeigen, um den von ScrollView bereitgestellten unendlichen Container zu füllen.
http://developer.android.com/reference/android/widget/ScrollView.html
quelle
Meine Anforderung besteht darin, eine ListView mit gleich großen Elementen in eine ScrollView aufzunehmen. Ich habe einige der anderen hier aufgeführten Lösungen ausprobiert. Keine schien die ListView richtig zu dimensionieren (entweder zu wenig oder zu viel Speicherplatz). Folgendes hat bei mir funktioniert:
Hoffe das hilft jemandem.
quelle
NIEMALS ein
ListView
Inneres in einScrollView
! Weitere Informationen zu diesem Thema finden Sie bei Google . Verwenden Sie in Ihrem Fall aLinearLayout
anstelle vonListView
und fügen Sie die Elemente programmgesteuert hinzu.quelle
Aktualisieren
zu
Der Punkt hier ist, dass Sie versuchen, die Höhe auf 0dp zu setzen (fest)
quelle
Ich habe eine Lösung für Scrollview -> Viewpager -> FragmentPagerAdapter -> Fragment -> Dynamic Listview gefunden, aber ich bin nicht der Autor. Es gibt einige Fehler, aber zumindest funktioniert es
Fragmentlayout kann alles sein
dann irgendwo einfach
quelle
Um die Listenansicht in der Bildlaufansicht zu verwenden, können Sie die folgenden Schritte ausführen, die für mich funktioniert haben:
1) Erstellen Sie eine NonScrollListView- Java-Datei, die die Standard-Bildlaufeigenschaft der Listenansicht deaktiviert. und Code ist unten
2) Jetzt XML - Datei erstellen , die die hat
NestedScrollView
und innerhalb dieser AnwendungNonScrollListView
für Ihre Artikel auflistet. Dadurch wird Ihr gesamter Bildschirm mit allen Ansichten gescrollt.3) Jetzt in der Java-Klasse dh home.java definieren
NonScrollListView
stattListview
.public class home erweitert Fragment {int pos = 0; ViewFlipper v_flipper;
Hinweis: Ich habe
Fragments
hier verwendet.quelle
Ok, hier ist meine Antwort. Die Methode zum Festlegen der ListView-Höhe ist zwar geschlossen, aber nicht perfekt. Falls die meisten Gegenstände die gleiche Höhe haben, funktionieren sie gut. Aber falls das nicht der Fall ist, gibt es ein großes Problem. Ich habe es viele Male versucht, und als ich den Wert von listItem.getMeasureHeight und listItem.getMeasuerWidth in das Protokoll eingegeben habe, habe ich festgestellt, dass die Breitenwerte stark variieren, was hier nicht erwartet wird, da alle Elemente in derselben ListView angezeigt werden sollten haben die gleiche Breite. Und da geht der Fehler:
Einige verwendeten Maße (0, 0), die die Ansicht in beiden Richtungen und in der Breite tatsächlich ungebunden machten. Einige haben versucht, die Breite von listView zu ermitteln, aber dann wird 0 zurückgegeben, was bedeutungslos ist.
Wenn ich weiter lese, wie Android die Ansicht rendert, stelle ich fest, dass all dieser Versuch die gesuchte Antwort nicht erreichen kann, es sei denn, diese Funktion wird ausgeführt, nachdem die Ansicht gerendert wurde.
Dieses Mal verwende ich den getViewTreeObserver in der ListView, für die ich die Höhe festlegen möchte, und füge dann OnGlobalLayoutListener hinzu. Innerhalb dieser Methode deklariere ich einen neuen OnGlobalLayoutListener, in dem getWidth diesmal die tatsächliche Breite der ListView zurückgibt.
Das Wertefeld ist das Auffüllen, das ich im ListView-Layout festgelegt habe.
quelle
Wenn Sie aus irgendeinem Grund nicht verwenden möchten
addHeaderView
undaddFooterView
z. B. wenn Sie mehrere Listen haben, ist es eine gute Idee, diese wiederzuverwendenListAdapter
, um eine einfache Liste zu füllenLinearLayout
sodass keine Bildlauffunktion vorhanden ist.Wenn Sie bereits ein ganzes Fragment abgeleitet haben
ListFragment
und es mit simpleLinearLayout
ohne Scrollen in ein ähnliches Fragment konvertieren möchten (z. B. um es in ScrollView einzufügen), können Sie ein Adapterfragment wie folgt implementieren:Möglicherweise möchten Sie auch weiterleiten
onCreate
,onPause
,onResume
usw. zu dem ursprünglichen Fragment je nach Ihren Bedürfnissen oder Erbschaft versuchen anstelle der Zusammensetzung (aber bestimmte Methoden außer Kraft setzen , so ursprüngliche Fragment ist eigentlich nicht zu Layout - Hierarchie gebunden); aber ich wollte das ursprüngliche Fragment so weit wie möglich isolieren, weil wir nur sein extrahieren müssenListAdapter
. Wenn Sie OriginalfragmentesetListAdapter
in aufrufenonAttach
, das ist wahrscheinlich genug.So verwenden Sie
ListAsArrayFragment
das EinfügenOriginalListFragment
ohne Scrollen. In übergeordneten AktivitätenonCreate
:quelle
Ich habe eine Lösung für Scrollview -> Viewpager -> FragmentPagerAdapter -> Fragment -> Dynamic Listview gefunden, aber ich bin nicht der Autor.
Fragmentlayout kann alles sein
dann irgendwo einfach
quelle
mit dieser ListView hat bei mir funktioniert
und in xml
und in MainActivity
In diesem Artikel finden Sie weitere Informationen und Informationen dazu, wie Sie die Rasteransicht in der Bildlaufansicht beibehalten
quelle
In XML:
In Java:
quelle
Legen Sie einfach den Wert der erforderlichen Höhe in einem Listenansicht-Höhenattribut in einer übergeordneten Bildlaufansicht fest. Es wird zusammen mit dem untergeordneten Element anderer Eltern gescrollt.
quelle
Das hat bei mir funktioniert ( link1 , link2 ):
Sie erstellen eine benutzerdefinierte Listenansicht, die nicht scrollbar ist
In Ihrer Layoutdatei
Erstellen Sie ein Objekt Ihrer customListview anstelle von ListView wie folgt:
quelle
Rufen Sie diese Funktion einfach auf, nachdem Sie den Adapter der Listenansicht zugewiesen haben
quelle
quelle
bester Code
quelle