Dapatkah seseorang dengan kata-kata sederhana menjelaskan kepada saya penggunaan getViewTypeCount()
dan getItemViewType()
metode ArrayAdapter
?
Ini menangani kasus di mana Anda ingin berbagai jenis tampilan untuk baris yang berbeda. Misalnya, dalam aplikasi kontak Anda mungkin ingin bahkan baris memiliki gambar di sisi kiri dan baris aneh memiliki gambar di sebelah kanan. Dalam hal ini, Anda akan menggunakan:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Kerangka kerja ini menggunakan jenis tampilan Anda untuk memutuskan tampilan mana yang akan Anda berikan convertView
dalam getView
metode Anda . Dengan kata lain, dalam contoh di atas, baris genap Anda hanya akan mendapatkan tampilan daur ulang dengan gambar di sisi kiri untuk digunakan kembali, dan baris ganjil hanya akan mendapatkan gambar dengan gambar di sebelah kanan.
Jika setiap baris dalam daftar Anda memiliki tata letak yang sama, Anda tidak perlu khawatir tentang jenis tampilan. Bahkan, BaseAdapter.java menyediakan perilaku default untuk semua adaptor:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Ini memang memberi Anda jenis tampilan yang sama untuk setiap baris.
Edit - untuk menguraikan alur umum:
AdapterView
menggunakan adaptor.AdapterView
mencoba untuk menampilkan item yang terlihat oleh pengguna.getItemViewType
baris n
, baris yang akan ditampilkan.n
. Tidak menemukan apa pun karena belum ada tampilan yang didaur ulang.getView
dipanggil untuk baris n
.getItemViewType
baris n
untuk menentukan jenis tampilan apa yang harus Anda gunakan.getView
, dan tampilan baris Anda ditampilkan kepada pengguna.Sekarang, ketika tampilan didaur ulang dengan menggulir layar, masuk ke kolam tampilan daur ulang yang dikelola oleh kerangka kerja. Ini pada dasarnya diatur oleh tipe tampilan sehingga tampilan tipe yang benar diberikan kepada Anda dalam convertView
parameter dalam getView
metode Anda :
getItemViewType
untuk baris yang ingin ditampilkan.convertView
parameter untuk getView
metode Anda .
Jika kita perlu menunjukkan berbagai jenis tampilan dalam tampilan-daftar maka itu baik untuk digunakan
getViewTypeCount()
dangetItemViewType()
dalam adaptor daripada mengubah tampilanView.GONE
danView.VISIBLE
bisa menjadi tugasgetView()
yang sangat mahal di dalam yang akan mempengaruhi daftar gulir.Silakan periksa ini untuk penggunaan
getViewTypeCount()
dangetItemViewType()
dalam Adaptor.Tautan: the use-of-getviewtypecount
sumber
Watch Outttt !!!!
Saya harus menghadapi masalah menerapkan
ListView
kemarin dan itu dua jenis tampilan untuk baris mendapat campur aduk setelah saya gulir. Meskipun jawaban pilihan teratas dalam utas ini memberikan penjelasan umum yang baik, itu belum menyoroti sedikit informasi yang paling penting untuk menghentikan bug UI di atas yang telah saya sebutkan.Berikut adalah penjelasan saya:
Kedua
getViewTypeCount()
dangetItemViewType()
sedang digunakan olehBaseAdapter
'sgetView
metode untuk mengetahui jenis pandangan harus itu mengambil, daur ulang dan kembali. (seperti yang dijelaskan dalam jawaban teratas di utas). Tetapi jika Anda tidak menerapkan kedua metode ini secara intuitif sesuai dengan Doc API Android, maka Anda mungkin masuk ke masalah yang saya sebutkan.Diringkas Pedoman pelaksanaan:
Untuk menerapkan beberapa jenis
Views
untukListView
's baris kita harus dasarnya menerapkan,getItemViewType()
dangetViewTypeCount()
metode. DangetItemViewType()
dokumentasi memberi kami Catatan sebagai berikut:Jadi di Anda,
getItemViewType()
Anda harus mengembalikan nilai untuk Jenis Tampilan, mulai dari 0, ke jenis terakhir sebagai (jumlah jenis - 1). Misalnya, katakanlah Anda hanya memiliki tiga jenis tampilan? Jadi tergantung pada objek data untuk tampilan, Anda hanya bisa mengembalikan 0 atau 1 atau 2 darigetItemViewType()
metode, seperti indeks array berbasis nol. Dan karena Anda memiliki tiga jenis tampilan yang digunakan,getViewTypeCount()
metode Anda harus mengembalikan 3.Dalam kasus apa pun jika Anda mengembalikan nilai integer lain seperti 1, 2, 3 atau 111, 222, 333 untuk metode ini, Anda pasti akan mengalami bug UI di atas yang baru saja Anda tempatkan dengan tidak mematuhi Android API Doc.
Jika Anda tidak mendapatkan petunjuk atau masih tidak dapat menyelesaikan dan memerlukan informasi lebih lanjut, baca jawaban terperinci saya dalam utas T&J StackOverflow ini .
Baca Dokumen Pengembang Android untuk informasi lebih lanjut Anda mungkin menemukan petunjuk secara langsung.
Semoga jawaban ini mungkin bermanfaat bagi seseorang di luar sana untuk menghemat banyak jam !!!
Bersulang!!!
sumber
IGNORE_ITEM_VIEW_TYPE
saya memiliki bug di salah satu ListView saya. Saya menggunakan ArrayAdapter untuk menyisipkan tampilan yang terdiri dari 1 gambar dan 2 tampilan teks. Saya hanya memiliki satu jenis tampilan. Saya mencoba untuk tidak menimpa metode getItemViewType, atau menimpanya dengan mengembalikan posisi atau integer hard-coded. Dalam semua kasus, saya mengalami duplikat dalam daftar saya, dengan perilaku aneh ketika menggulir (duplikat perubahan). KembaliIGNORE_ITEM_VIEW_TYPE
dalam metode memperbaiki masalah. Terima kasih.