Ich stehe vor einem sehr häufigen Problem: Ich habe eine Aktivität angelegt, und jetzt stellt sich heraus, dass darin einige Elemente angezeigt werden sollten ScrollView
. Der normale Weg, dies zu tun, wäre, das vorhandene zu verwenden ListAdapter
, es mit einem zu verbinden ListView
und BOOM Ich hätte meine Liste von Elementen.
ABER Sie sollten kein verschachteltes ListView
in ein platzieren, ScrollView
da dies das Scrollen vermasselt - selbst Android Lint beschwert sich darüber.
Hier ist meine Frage:
Wie verbinde ich ein ListAdapter
mit einem LinearLayout
oder etwas Ähnlichem?
Ich weiß, dass diese Lösung nicht für viele Elemente skaliert werden kann, aber meine Listen sind sehr kurz (<10 Elemente), sodass die Wiederverwendung von Ansichten nicht wirklich erforderlich ist. In Bezug auf die Leistung kann ich damit leben, alle Ansichten direkt in die zu platzieren LinearLayout
.
Eine Lösung, die ich mir ausgedacht habe, wäre, mein vorhandenes Aktivitätslayout im Abschnitt headerView des zu platzieren ListView
. Aber das fühlt sich an, als würde man diesen Mechanismus missbrauchen, also suche ich nach einer saubereren Lösung.
Ideen?
UPDATE: Um die richtige Richtung zu finden, füge ich ein Beispiellayout hinzu, um mein Problem zu zeigen:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_detail_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/news_detail_layout_side_padding"
android:paddingRight="@dimen/news_detail_layout_side_padding"
android:paddingTop="@dimen/news_detail_layout_vertical_padding"
android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
>
<TextView
android:id="@+id/news_detail_date"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="LALALA"
android:textSize="@dimen/news_detail_date_height"
android:textColor="@color/font_black"
/>
<Gallery
android:id="@+id/news_detail_image"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingTop="5dip"
android:paddingBottom="5dip"
/>
<TextView
android:id="@+id/news_detail_headline"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="Some awesome headline"
android:textSize="@dimen/news_detail_headline_height"
android:textColor="@color/font_black"
android:paddingTop="@dimen/news_detail_headline_paddingTop"
android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
/>
<TextView
android:id="@+id/news_detail_content"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Here comes a lot of text so the scrollview is really needed."
android:textSize="@dimen/news_detail_content_height"
android:textColor="@color/font_black"
/>
<!---
HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER.
They should be positioned at the end of the content, so making the scrollview smaller is not an option.
---->
</LinearLayout>
</ScrollView>
</LinearLayout>
UPDATE 2 Ich habe die Überschrift geändert, um das Verständnis zu erleichtern (habe eine Gegenstimme bekommen, doh!).
quelle
Antworten:
Sie sollten Ihre Artikel wahrscheinlich nur manuell hinzufügen zu
LinearLayout
:BEARBEITEN : Ich habe diesen Ansatz abgelehnt, als ich ungefähr 200 nicht triviale Listenelemente anzeigen musste. Er ist sehr langsam. Nexus 4 benötigte ungefähr 2 Sekunden, um meine "Liste" anzuzeigen, was nicht akzeptabel war. Also wandte ich mich mit Kopfzeilen an Flos Ansatz. Es funktioniert viel schneller, da Listenansichten bei Bedarf erstellt werden, wenn der Benutzer einen Bildlauf durchführt, und nicht zum Zeitpunkt der Erstellung der Ansicht.
Fortsetzen: Das manuelle Hinzufügen von Ansichten zum Layout ist einfacher zu codieren (daher möglicherweise weniger bewegliche Teile und Fehler), weist jedoch Leistungsprobleme auf. Wenn Sie also 50 Ansichten oder mehr haben, empfehle ich, den Header-Ansatz zu verwenden.
Beispiel. Grundsätzlich wandelt sich das Aktivitäts- (oder Fragment-) Layout in etwa so um (es wird keine ScrollView mehr benötigt):
Dann müssen Sie in
onCreateView()
(ich verwende ein Beispiel mit einem Fragment) eine Header-Ansicht hinzufügen und dann einen Adapter festlegen (ich gehe davon aus, dass die Header-Ressourcen-ID lautetheader_layout
):quelle
ListAdapter
undListView
hinter den Bildschirmen mehr Magie steckt, was ich dann nicht manuell mache.notifyDataSetChanged
? Dies funktioniert gut mit einem anderen Adapter, den ich an einen angeschlossen habeListView
, aber es scheint nicht mit dem zu funktionieren, den ich an einen angeschlossen habeLinearLayout
.Ich würde mich an die Lösung für die Header-Ansicht halten. Daran ist nichts auszusetzen. Im Moment implementiere ich eine Aktivität mit genau dem gleichen Ansatz.
Offensichtlich ist der "Artikelteil" dynamischer als statisch (Variation der Artikelanzahl gegenüber der Anzahl der festen Artikel usw.), da Sie sonst überhaupt nicht an die Verwendung eines Adapters denken. Wenn Sie also einen Adapter benötigen, verwenden Sie die ListView.
Das Implementieren einer Lösung, die ein LinearLayout von einem Adapter aus auffüllt, ist am Ende nichts anderes als das Erstellen einer ListView mit einem benutzerdefinierten Layout.
Nur meine 2 Cent.
quelle
ListView
. Ich bin mir nicht sicher, ob mir diese Patch-Arbeit gefällt.Setzen Sie Ihre Ansicht auf main.xml onCreate und blasen Sie sie dann aus row.xml auf
main.xml
row.xml
quelle
Ich verwende folgenden Code, der die Adapterfunktionalität mit
ViewGroup
und repliziertTabLayout
. Das Gute daran ist, dass wenn Sie Ihre Liste ändern und erneut binden, dies nur geänderte Elemente betrifft:Verwendung:
Für
ViewGroups
:Denn
TabLayout
ich habe folgendes:quelle