Saya memiliki adaptor daftar khusus:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
dalam metode 'getView' yang ditimpa, saya mencetak untuk memeriksa posisi apa dan apakah itu convertView atau tidak:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
Output dari ini (ketika daftar pertama kali ditampilkan, belum ada input pengguna)
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, meskipun saya tidak dapat menemukannya secara eksplisit, getView () hanya dipanggil untuk baris yang terlihat. Karena aplikasi saya dimulai dengan empat baris yang terlihat setidaknya nomor posisi yang dirangkai dari 0-3 masuk akal. Tetapi sisanya berantakan:
- Mengapa getview dipanggil untuk setiap baris tiga kali?
- Di mana konversi convertews ini berasal ketika saya belum menggulir?
Saya melakukan sedikit penelitian, dan tanpa mendapatkan jawaban yang baik, saya melihat ada orang yang mengaitkan masalah ini dengan masalah tata letak. Jadi dalam hal ini, inilah tata letak yang berisi daftar:
<?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>
dan tata letak setiap baris individual:
<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>
Terima kasih atas waktu Anda
ListView
memiliki ketinggianwrap_content
, sehingga tidak yakin tentang tinggi badan karena itu memaparkan beberapa anak sebagai semacam tester untuk melihat apa yang cocok. Ubah AndaListView
untukfill_parent
kemudian memeriksa log Anda panggilan harus dikurangi secara dramatis.Cobalah dengan
match_parent
padalayout_height
properti dari tampilan daftar. Itu akan mencegahgetView()
untuk dipanggil begitu sering.sumber
fill_parent
harus diganti denganmatch_parent
untuk API level 8 dan lebih tinggi.Saya menyingkirkan masalah ini ketika saya mengubah layout_width dan layout_height menjadi match_parent (hanya mengubah layout_height tidak membantu).
Catatan berguna hati-hati jika Anda memiliki item bersarang. Anda harus mengubah yang "tertinggi" menjadi match_parent . Semoga ini bisa membantu seseorang.
sumber
wrap_content
, makaListView
tidak tahu berapa banyak item daftar yang ada untuk menjadi konten Daftar, itulah mengapaListView
mencoba membuat sebanyak mungkin baris yang menurutnya cocok untuk ditampilkan, dan ketika Anda menggunakanfill_parent
ataumatch_parent
,ListView
berpikir, baiklah, tinggi saya adalahx
dan saya perlun
jumlah baris untuk ditampilkan.Saya tidak dapat menjawab pertanyaan "Mengapa" Anda, tetapi saya pasti memiliki solusi untuk masalah " ListView items repeating " yang mengganggu (jika Anda memiliki item dalam koleksi Anda yang lebih dari ketinggian layar).
Seperti banyak orang di atas telah disebutkan, menjaga android: layout_height milik ListVew tag sebagai fill_parent .
Dan tentang fungsi getView (), solusinya adalah menggunakan kelas statis yang disebut ViewHolder . Lihatlah contoh ini . Berhasil melakukan tugas menambahkan semua item di Array atau ArrayCollection Anda.
Semoga ini bisa membantu teman !!
Salam, Siddhant
sumber
GridView
dan berubahandroid:layout_height
danandroid:layout_width
tidak bekerja untuk saya. Tetapi dengan menggunakanViewHolder
gambar berulang tetap untuk saya, saya pergi melalui tutorial ini android-vogue.blogspot.com/2011/06/...Pertanyaan: Mengapa panggilan Adapter getView () berkali-kali? Jawab: Saat Listview merender pada pengguliran adalah menyegarkan tampilan itu dengan tampilan berikutnya yang akan datang, yang adaptor perlu mendapatkan tampilan dengan memanggil getView ().
Pertanyaan: Mengapa panggilan lebih kecil jika lebar dan tinggi tampilan daftar diatur ke fill_parent? Jawab: Karena inflator memiliki ukuran tetap untuk area layar untuk daftar, ia menghitung satu kali untuk menampilkan tampilan ke layar.
Semoga ini akan menyelesaikan kueri Anda.
sumber
Saya mengalami masalah yang sama dengan dropdown di AutoCompleteTextView. Saya berjuang dengan masalah selama dua hari sampai saya tiba di sini dan Anda menunjukkan solusinya.
Jika saya menulis dropDownHeight = "match_parent" masalahnya sudah diperbaiki. Sekarang masalahnya terkait dengan UI (ketika Anda memiliki satu item dropdown terlalu besar) tetapi masalah beberapa panggilan (jauh lebih penting) telah diperbaiki.
Terima kasih!!
sumber
"Mengapa getview dipanggil untuk setiap baris tiga kali?" Karena getView dipanggil ketika Anda menggulir pada tampilan daftar dan mengatakan lebih baik maka itu dipanggil ketika posisi tampilan daftar Anda diubah!
sumber
Saya memiliki masalah yang sama. Jika saya mengatur ketinggian ke fill_parent, maka saya mendapatkan "biasanya" 2 panggilan per baris. Tetapi, jika saya mengatur tinggi ListView saya ke nilai yang tepat, katakanlah menjadi 300dp, maka saya mendapatkan persis satu panggilan GetView per baris.
Jadi, menurut saya satu-satunya cara adalah pertama-tama menentukan ketinggian layar, kemudian secara terprogram mengatur tinggi listvilew ke nilai itu. Saya tidak suka itu. Saya harap ada cara yang lebih baik.
sumber
Untuk Anda semua yang masih (Setelah mengatur to
height
the ) macet (seperti saya):ListView
match_parent
Anda juga harus mengatur
height
tata letak induk kematch_parent
.Lihat contoh di bawah ini. The
LinearLayout
adalah orang tua di sini:sumber
Ini mungkin datang terlambat tetapi jika Anda menggunakan
layout_weight
ingat untuk selalu mengaturlayout_width="0dp"
sumber
saya membuat solusi ini, mungkin bukan yang terbaik, tetapi apakah berhasil ...
lalu =
semoga membantu!
sumber