Ich habe einen benutzerdefinierten Listenadapter:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
Bei der überschriebenen 'getView'-Methode drucke ich, um zu überprüfen, welche Position sich befindet und ob es sich um eine convertView handelt oder nicht:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
Die Ausgabe davon (wenn die Liste zum ersten Mal angezeigt wird, noch keine Benutzereingabe)
04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 null
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0
AFAIK, obwohl ich es nicht explizit finden konnte, wird getView () nur für sichtbare Zeilen aufgerufen. Da meine App mit vier sichtbaren Zeilen beginnt, sind mindestens die Positionsnummern von 0-3 sinnvoll. Aber der Rest ist ein Chaos:
- Warum wird getview für jede Zeile dreimal aufgerufen?
- Woher kommen diese convertViews, wenn ich noch nicht gescrollt habe?
Ich habe ein bisschen nachgeforscht und ohne eine gute Antwort zu bekommen, habe ich bemerkt, dass Leute dieses Problem mit Layoutproblemen in Verbindung bringen. Für den Fall, hier ist das Layout, das die Liste enthält:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/pageDetails"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false" />
</LinearLayout>
und das Layout jeder einzelnen Zeile:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">
<ImageView
android:id="@+id/thumb"
android:layout_width="120dp"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginRight="8dp"
android:src="@drawable/loading" />
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentBottom="true"
android:singleLine="true" />
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:paddingRight="4dp"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="17dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:paddingRight="4dp"
android:layout_alignWithParentIfMissing="true"
android:gravity="center" />
</RelativeLayout>
Vielen Dank für Ihre Zeit
ListView
haben eine Größe vonwrap_content
, daher ist es nicht sicher, wie hoch es ist, daher werden einige Kinder als eine Art Tester eingesetzt, um zu sehen, was hineinpasst. Ändern Sie Ihre,ListView
umfill_parent
dann Ihre Protokolle zu überprüfen Die Anrufe sollten drastisch reduziert werden.Versuchen Sie es mit
match_parent
derlayout_height
Eigenschaft der Listenansicht. Es wird verhindertgetView()
, so oft angerufen zu werden.quelle
fill_parent
diesmatch_parent
für API Level 8 und höher ersetzt werden sollte.Ich habe dieses Problem behoben, als ich sowohl layout_width als auch layout_height in match_parent geändert habe (es hat nicht geholfen, nur layout_height zu ändern ).
Hilfreiche Notiz Achten Sie darauf, ob Sie verschachtelte Elemente haben. Sie müssen die "höchste" in " match_parent " ändern . Hoffe es hilft jemandem.
quelle
wrap_content
, dannListView
weiß nicht , wie vielen Listeneintrag gibt es Liste Inhalt werden, das ist , warumListView
versucht so viele Zeilen zu erstellen , wie es ist denkt Anzeige geeignet, und wenn Siefill_parent
odermatch_parent
,ListView
denkt, in Ordnung, meine Größe istx
und ich brauche dien
Anzahl der Zeilen zu zeigen.Ich kann Ihre "Warum" -Frage nicht beantworten, aber ich habe definitiv eine Lösung für das Problem des irritierenden Problems " Wiederholung von ListView-Elementen " (wenn Sie Elemente in Ihrer Sammlung haben, die größer als die Bildschirmhöhe sind).
Wie viele der oben genannten Personen bereits erwähnt haben, behalten Sie die Eigenschaft android: layout_height derBehalten Sie, wie ListVew- Tags als fill_parent bei .
Bei der Funktion getView () besteht die Lösung darin, eine statische Klasse namens aufzurufen ViewHolder zu verwenden . Schauen Sie sich dieses Beispiel an. Es führt erfolgreich die Aufgabe aus, alle Elemente in ur Array oder ArrayCollection hinzuzufügen.
Hoffe das hilft Freunden !!
Beste Grüße, Siddhant
quelle
GridView
und geändert werden,android:layout_height
undandroid:layout_width
arbeite nicht für mich. Aber mitViewHolder
festen, sich wiederholenden Bildern für mich ging ich durch dieses Tutorial android-vogue.blogspot.com/2011/06/…Fragen: Warum ruft der Adapter getView () oft auf? Antwort: Wenn Listview beim Scrollen gerendert wird, wird die Ansicht mit den nächsten Ansichten aktualisiert, für die der Adapter Ansichten aufrufen muss, indem er getView () aufruft.
Fragen: Warum werden Aufrufe geringer, wenn die Breite und Höhe der Listenansicht auf fill_parent gesetzt ist? Antwort: Da der Inflator die feste Größe für den Bildschirmbereich für die Liste hat, wird er einmal berechnet, um die Ansichten auf dem Bildschirm zu rendern.
Hoffe, es wird Ihre Anfrage lösen.
quelle
Ich hatte das gleiche Problem mit der Dropdown-Liste in einer AutoCompleteTextView. Ich habe zwei Tage lang mit dem Problem gekämpft, bis ich hier ankomme und Sie mir die Lösung zeigen.
Wenn ich dropDownHeight = "match_parent" schreibe, ist das Problem behoben. Jetzt hängt das Problem mit der Benutzeroberfläche zusammen (wenn Sie ein Element haben, ist die Dropdown-Liste zu groß), aber das Problem mit mehreren Anrufen (viel wichtiger) ist behoben.
Danke dir!!
quelle
"Warum wird getview für jede Zeile dreimal aufgerufen?" Weil getView aufgerufen wird, wenn Sie in der Listenansicht scrollen und besser gesagt, dass es aufgerufen wird, wenn die Position einer Ansicht Ihrer Liste geändert wird!
quelle
Ich habe das gleiche Problem. Wenn ich die Höhe auf fill_parent eingestellt habe, erhalte ich "normalerweise" 2 Aufrufe pro Zeile. Wenn ich jedoch die Höhe meiner ListView auf den exakten Wert setze, z. B. 300 dp, erhalte ich genau einen GetView-Aufruf pro Zeile.
Es scheint mir also, dass die einzige Möglichkeit darin besteht, zuerst die Höhe des Bildschirms zu bestimmen und dann programmgesteuert die Höhe von listvilew auf diesen Wert zu setzen. Ich mag es nicht Ich hoffe es gibt einen besseren Weg.
quelle
Für alle, die noch (nach dem Einstellen
height
desListView
tomatch_parent
) festsitzen (wie ich):Sie müssen auch
height
das übergeordnete Layout auf einstellenmatch_parent
.Siehe Beispiel unten. Das
LinearLayout
ist der Elternteil hier:quelle
Dies kann zu spät kommen, aber wenn Sie verwenden,
layout_weight
denken Sie daran, immer einzustellenlayout_width="0dp"
quelle
Ich habe diese Lösung gemacht, vielleicht ist sie nicht die beste, aber sie macht die Arbeit ...
dann =
ich hoffe es hilft!
quelle