Saya mencoba menentukan cara terbaik untuk memiliki satu ListView yang berisi tata letak yang berbeda untuk setiap baris. Saya tahu cara membuat baris kustom + adaptor array kustom untuk mendukung baris khusus untuk seluruh tampilan daftar, tetapi bagaimana saya bisa menerapkan banyak gaya baris yang berbeda di ListView?
android
listview
listviewitem
w.donahue
sumber
sumber
Jawaban:
Karena Anda tahu berapa banyak jenis tata letak yang Anda miliki - Anda dapat menggunakan metode-metode itu.
getViewTypeCount()
- metode ini mengembalikan informasi berapa banyak jenis baris yang Anda miliki dalam daftar AndagetItemViewType(int position)
- mengembalikan informasi jenis tata letak yang harus Anda gunakan berdasarkan posisiKemudian Anda mengembang tata letak hanya jika itu nol dan tentukan jenis menggunakan
getItemViewType
.Lihatlah tutorial ini untuk informasi lebih lanjut.
Untuk mencapai beberapa optimasi dalam struktur yang telah Anda jelaskan dalam komentar saya sarankan:
ViewHolder
. Ini akan meningkatkan kecepatan karena Anda tidak perlu meneleponfindViewById()
setiap kali dalamgetView
metode. Lihat List14 dalam demo API .Saya harap itu akan membantu Anda. Jika Anda dapat memberikan beberapa rintisan XML dengan struktur data dan informasi bagaimana tepatnya Anda ingin memetakannya menjadi baris, saya akan dapat memberi Anda saran yang lebih tepat. Berdasarkan piksel.
sumber
Anda sudah tahu dasar-dasarnya. Anda hanya perlu mendapatkan adaptor khusus untuk mengembalikan tata letak / tampilan berbeda berdasarkan informasi baris / kursor yang disediakan.
A
ListView
dapat mendukung beberapa gaya baris karena berasal dari AdapterView :Jika Anda melihat Adaptor , Anda akan melihat metode yang memperhitungkan penggunaan tampilan spesifik baris:
Dua metode terakhir menyediakan posisi sehingga Anda dapat menggunakannya untuk menentukan jenis tampilan yang harus Anda gunakan untuk baris itu .
Tentu saja, Anda biasanya tidak menggunakan AdapterView dan Adaptor secara langsung, melainkan menggunakan atau berasal dari salah satu subclass mereka. Subkelas Adaptor dapat menambahkan fungsionalitas tambahan yang mengubah cara mendapatkan tata letak khusus untuk baris yang berbeda. Karena tampilan yang digunakan untuk baris tertentu digerakkan oleh adaptor, triknya adalah membuat adaptor mengembalikan tampilan yang diinginkan untuk baris tertentu. Cara melakukannya berbeda tergantung pada adaptor spesifik.
Misalnya, untuk menggunakan ArrayAdapter ,
getView()
untuk mengembang, mengisi, dan mengembalikan tampilan yang diinginkan untuk posisi yang diberikan. ThegetView()
Metode meliputi kesempatan reuse pandangan melaluiconvertView
parameter.Tetapi untuk menggunakan turunan dari CursorAdapter ,
newView()
untuk mengembang, mengisi, dan mengembalikan tampilan yang diinginkan untuk keadaan kursor saat ini (yaitu "baris" saat ini) [Anda juga perlu menggantibindView
agar widget dapat menggunakan kembali tampilan]Namun, untuk menggunakan SimpleCursorAdapter ,
SimpleCursorAdapter.ViewBinder
dengansetViewValue()
metode untuk mengembang, mengisi, dan mengembalikan tampilan yang diinginkan untuk baris yang diberikan (keadaan kursor saat ini) dan data "kolom". Metode ini hanya dapat mendefinisikan tampilan "khusus" dan tunduk pada perilaku standar SimpleCursorAdapter untuk binding "normal".Cari contoh / tutorial khusus untuk jenis adaptor yang akhirnya Anda gunakan.
sumber
BaseAdapter
. Berasal dari BaseAdapter akan menjadi yang paling "fleksibel", tetapi akan menjadi yang terburuk dalam penggunaan ulang dan kematangan kode karena tidak memanfaatkan pengetahuan dan kematangan yang sudah dimasukkan ke dalam adaptor lain.BaseAdapter
ada untuk konteks non-standar di mana adaptor lain tidak cocok.CursorAdapter
danSimpleCursorAdapter
.ArrayAdapter
, tidak peduli tata letak apa yang Anda berikan pada konstruktor, asalkangetView()
mengembang dan mengembalikan jenis tata letak yang tepatgetViewTypeCount()
hanya dipicu sekali setiap kali Anda meneleponListView.setAdapter()
, bukan untuk setiapAdapter.notifyDataSetChanged()
.Lihatlah kode di bawah ini.
Pertama, kami membuat tata letak khusus. Dalam hal ini, empat tipe.
even.xml
odd.xml
white.xml
black.xml
Lalu, kami membuat item listview. Dalam kasus kami, dengan string dan tipe.
Setelah itu, kami membuat view view. Ini sangat disarankan karena OS Android menyimpan referensi tata letak untuk menggunakan kembali item Anda saat item itu hilang dan muncul kembali di layar. Jika Anda tidak menggunakan pendekatan ini, setiap kali item Anda muncul di layar, OS Android akan membuat yang baru dan menyebabkan aplikasi Anda bocor memori.
Terakhir, kami membuat adaptor khusus kami menggantikan getViewTypeCount () dan getItemViewType (posisi int).
Dan aktivitas kami adalah seperti ini:
sekarang buat listview di dalam mainactivity.xml seperti ini
sumber
Di adaptor larik kustom Anda, Anda mengganti metode getView (), seperti yang mungkin Anda kenal. Maka yang harus Anda lakukan adalah menggunakan pernyataan switch atau pernyataan if untuk mengembalikan tampilan kustom tertentu tergantung pada argumen posisi yang diteruskan ke metode getView. Android pintar karena hanya akan memberi Anda convertView dari jenis yang sesuai untuk posisi / baris Anda; Anda tidak perlu memeriksa apakah jenisnya benar. Anda dapat membantu Android dalam hal ini dengan mengganti metode getItemViewType () dan getViewTypeCount () dengan tepat.
sumber
Jika kita perlu menunjukkan berbagai jenis tampilan dalam tampilan daftar maka bagus untuk menggunakan getViewTypeCount () dan getItemViewType () dalam adaptor alih-alih beralih tampilan VIEW.GONE dan VIEW.VISIBLE bisa menjadi tugas yang sangat mahal di dalam getView () yang akan mempengaruhi daftar gulir.
Silakan periksa ini untuk penggunaan getViewTypeCount () dan getItemViewType () di Adapter.
Tautan: the use-of-getviewtypecount
sumber
ListView dimaksudkan untuk kasus penggunaan sederhana seperti tampilan statis yang sama untuk semua item baris.
Karena Anda harus membuat ViewHolders dan memanfaatkan secara signifikan
getItemViewType()
, dan secara dinamis menampilkan tata letak item baris yang berbeda xml, Anda harus mencoba melakukan itu menggunakan RecyclerView , yang tersedia di Android API 22. Ia menawarkan dukungan dan struktur yang lebih baik untuk berbagai jenis tampilan.Lihatlah tutorial ini tentang cara menggunakan RecyclerView untuk melakukan apa yang Anda cari.
sumber