Mam niestandardowy adapter listy:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
w nadpisanej metodzie 'getView' robię wydruk, aby sprawdzić, jaka jest pozycja i czy jest to convertView, czy nie:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
Wynik tego (kiedy lista jest wyświetlana po raz pierwszy, na razie brak danych wejściowych użytkownika)
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, chociaż nie mogłem znaleźć tego wyraźnie, getView () jest wywoływana tylko dla widocznych wierszy. Ponieważ moja aplikacja zaczyna się od czterech widocznych wierszy, przynajmniej numery pozycji zmieniające się od 0 do 3 mają sens. Ale reszta to bałagan:
- Dlaczego getview jest wywoływane dla każdego wiersza trzy razy?
- Skąd pochodzą te ConvertViews, kiedy jeszcze nie przewinąłem?
Zrobiłem trochę badań i bez uzyskania dobrej odpowiedzi zauważyłem, że ludzie kojarzą ten problem z problemami z układem. Więc na wszelki wypadek, oto układ, który zawiera listę:
<?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>
oraz układ każdego pojedynczego rzędu:
<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>
Dziękuję za Twój czas
ListView
ma wysokośćwrap_content
, więc to nie jest pewny, że to wysokość dlatego ustanawia niektóre dzieci się jako rodzaj testera, aby zobaczyć, co będzie pasować. zmienićListView
, abyfill_parent
następnie sprawdzić logi liczba wezwań powinna zostać radykalnie ograniczona.Spróbuj z
match_parent
nalayout_height
właściwości widoku listy. ZapobiegniegetView()
tak częstemu wywoływaniu.źródło
fill_parent
należy je zastąpićmatch_parent
dla poziomu API 8 i wyższych.Pozbyłem się tego problemu, kiedy zmieniłem zarówno layout_width, jak i layout_height na match_parent (zmiana tylko layout_height nie pomogła).
Przydatna uwaga, uważaj, jeśli masz zagnieżdżone elementy. Musisz zmienić „najwyższy” na match_parent . Mam nadzieję, że to komuś pomoże.
źródło
wrap_content
,ListView
nie wiesz, ile elementów listy jest dostępnych, aby stać się treścią listy, dlategoListView
próbuje utworzyć tyle wierszy, ile uważa za odpowiednich do wyświetlenia, a kiedy używaszfill_parent
lubmatch_parent
,ListView
myśli, w porządku, mój wzrost jestx
i potrzebujęn
liczby wierszy do wyświetlenia.Nie jestem w stanie odpowiedzieć na Twoje pytanie "Dlaczego" ale na pewno mam rozwiązanie problemu irytującego " powtarzania się elementów ListView problemu „ ” (jeśli masz w swojej kolekcji elementy, które są większe niż wysokość ekranu).
Jak wielu ludzi wyżej wspomniałem, utrzymać android: layout_height własność ListVew znacznika jako fill_parent .
Jeśli chodzi o funkcję getView (), rozwiązaniem jest użycie statycznej klasy o nazwie ViewHolder . Sprawdź to przykład. Z powodzeniem wykonuje zadanie dodawania wszystkich elementów w ur Array lub ArrayCollection.
Mam nadzieję, że to pomoże przyjaciołom!
Z poważaniem, Siddhant
źródło
GridView
i zmieniających sięandroid:layout_height
iandroid:layout_width
nie działa dla mnie. Ale używającViewHolder
stałych, powtarzających się obrazów, przeszedłem przez ten samouczek android-vogue.blogspot.com/2011/06/...Pytania: Dlaczego adapter wielokrotnie wywołuje metodę getView ()? Odp: Gdy Listview renderuje się podczas przewijania, odświeża swój widok kolejnymi nadchodzącymi widokami, dla których adapter musi uzyskać widoki, wywołując metodę getView ().
Zapytania: Dlaczego wywołuje mniejszą wartość, jeśli szerokość i wysokość widoku listy są ustawione na fill_parent? Odp: Ponieważ inflator ma stały rozmiar obszaru ekranu dla listy, oblicza go raz w celu renderowania widoków na ekranie.
Mam nadzieję, że to rozwiąże Twoje pytanie.
źródło
Miałem ten sam problem z menu rozwijanym w AutoCompleteTextView. Walczyłem z tym problemem przez dwa dni, aż tu dotarłem, a ty pokazałeś mi rozwiązanie.
Jeśli napiszę dropDownHeight = "match_parent", problem został rozwiązany. Teraz problem jest związany z interfejsem użytkownika (gdy masz jeden element, lista rozwijana jest zbyt duża), ale problem wielu wywołań (o wiele ważniejszy) został rozwiązany.
Dziękuję Ci!!
źródło
„Dlaczego getview jest wywoływane dla każdego wiersza trzy razy?” Ponieważ getView jest wywoływane, gdy przewijasz listę w widoku listy, a mówiąc lepiej, jest wywoływane, gdy pozycja widoku listy zostanie zmieniona!
źródło
Mam ten sam problem. Jeśli wysokość jest ustawiona na fill_parent, otrzymuję „zwykle” 2 wywołania w każdym wierszu. Ale jeśli ustawię wysokość mojego ListView na dokładną wartość, powiedzmy na 300dp, otrzymam dokładnie jedno wywołanie GetView na wiersz.
Wydaje mi się więc, że jedynym sposobem jest najpierw określenie wysokości ekranu, a następnie programowe ustawienie wysokości listvilew na tę wartość. Nie podoba mi się to. Mam nadzieję, że jest lepszy sposób.
źródło
Dla wszystkich z was, którzy nadal (po ustawieniu
height
opcjiListView
domatch_parent
) utknęli (tak jak ja):Musisz także ustawić
height
układ nadrzędny namatch_parent
.Zobacz przykład poniżej. Tutaj
LinearLayout
jest rodzicem:źródło
Może się to spóźnić, ale jeśli używasz,
layout_weight
pamiętaj, aby zawsze ustawićlayout_width="0dp"
źródło
zrobiłem to rozwiązanie, może nie jest najlepsze, ale działa ...
następnie =
mam nadzieję, że to pomoże!
źródło