Saya ingin tahu tentang tujuan metode getItem
dan getItemId
di kelas Adaptor di Android SDK.
Dari uraian, tampaknya getItem
harus mengembalikan data yang mendasarinya. Jadi, jika saya memiliki array nama ["cat","dog","red"]
dan saya membuat adaptor a
menggunakan itu, maka a.getItem(1)
harus mengembalikan "anjing", benar? Apa yang harus a.getItemId(1)
dikembalikan?
Jika Anda menggunakan metode ini dalam praktiknya, dapatkah Anda memberikan contoh?
getItemId()
diArrayAdapter()
selalu mengembalikan-1
denganassert false : "TODO"; return -1;
Jawaban:
Saya melihat metode ini sebagai pendekatan yang lebih bersih untuk mengakses data daftar saya. Alih-alih secara langsung mengakses objek adaptor saya melalui sesuatu seperti
myListData.get(position)
saya cukup memanggil adaptor sepertiadapter.get(position)
.Hal yang sama berlaku untuk
getItemId
. Biasanya saya akan menggunakan metode ini ketika saya ingin menjalankan beberapa tugas berdasarkan ID unik suatu objek dalam daftar. Ini sangat berguna saat bekerja dengan database. Yang dikembalikanid
bisa menjadi referensi ke objek dalam database yang kemudian saya dapat melakukan operasi yang berbeda pada (pembaruan / hapus / dll).Jadi, alih-alih mengakses ID dari objek data mentah seperti
myListData.get(position).getId()
yang dapat Anda gunakanadapter.getItemId(position)
.Salah satu contoh di mana saya merasa perlu menggunakan metode ini adalah dalam proyek menggunakan SeparatedListViewAdapter . Adaptor ini dapat berisi berbagai jenis adaptor, masing-masing mewakili data dari jenis yang berbeda (biasanya). Saat menelepon
getItem(position)
padaSeparatedListViewAdapter
, objek kembali mungkin berbeda tergantung pada "bagian" posisi adalah bahwa Anda kirimkan.Sebagai contoh, jika Anda memiliki 2 bagian dalam daftar Anda (buah dan permen): Jika Anda menggunakan
getItem(position)
danposition
kebetulan berada pada item di bagian buah , Anda akan menerima objek yang berbeda daripada jika Anda dimintagetItem(position)
denganposition
menunjuk ke item dalam permen. bagian. Anda kemudian dapat mengembalikan semacam nilai ID konstangetItemId(position)
yang mewakili jenis data apagetItem(position)
yang dikembalikan, atau gunakaninstanceof
untuk menentukan objek apa yang Anda miliki.Selain apa yang saya sebutkan, saya tidak pernah merasa benar-benar perlu menggunakan metode ini
sumber
getView
,getCount
,getViewTypeCount
, Dll digunakan khusus untuk benar menampilkan UI ListView Anda. fungsi-fungsi lain hanya membantu membuat mengimplementasikan fungsi-fungsi lain seperti melakukan tindakan lebih lanjut setelah mengklik suatu item, dll. walaupun saya sering menggunakangetItem
insidegetView
getItemId
, kembali saja0L
ataunull
jangan gunakan di mana saja. Saya tidak melihat alasan yang jelas mengapa UUID akan lebih berharga dari sekadarlong
nilai ID. Mode terputus? Apa itu?Yah, sepertinya pertanyaan ini bisa dijawab dengan cara yang lebih sederhana dan langsung ... :-)
Sederhananya, Android memungkinkan Anda untuk melampirkan item
long
apa punListView
, sesederhana itu. Ketika sistem memberi tahu Anda tentang pilihan pengguna, Anda menerima tiga variabel pengenal untuk memberi tahu Anda apa yang dipilih:long
Anda lampirkan pada elemen individual.Terserah Anda untuk memutuskan mana dari ketiganya yang paling mudah untuk Anda tangani dalam kasus khusus Anda, tetapi Anda memiliki ketiganya untuk dipilih setiap saat. Anggap ini
long
sebagai tag yang secara otomatis dilampirkan pada item, hanya saja itu lebih sederhana dan lebih mudah dibaca.Kesalahpahaman tentang apa yang biasanya terjadi berasal dari konvensi sederhana. Semua adaptor harus memberikan
getItemId()
bahkan jika mereka tidak benar-benar menggunakan identifikasi ketiga ini. Jadi, berdasarkan konvensi, adaptor tersebut (termasuk banyak sampel dalam SDK atau seluruh web) kembaliposition
dengan satu alasan: selalu unik. Namun, jika adaptor kembaliposition
, ini benar-benar berarti ia tidak ingin menggunakan fitur ini sama sekali, karenaposition
sudah diketahui.Jadi, jika Anda perlu mengembalikan nilai lain yang Anda inginkan, jangan ragu untuk melakukannya:
sumber
getItemId()
... Apa yang terjadi ketika / jika metode ini tidak diganti dalam adaptor khusus Anda?The
getItemId
Metode sebagian besar dirancang untuk bekerja dengan Cursors yang didukung oleh database SQLite. Ini akan mengembalikan bidang id kursor yang mendasari untuk item di posisi 1.Dalam kasus Anda, tidak ada id untuk item di posisi 1: Saya mengasumsikan implementasi ArrayAdapter hanya mengembalikan -1 atau 0.
EDIT: sebenarnya, itu hanya mengembalikan posisi: dalam hal ini
1
.sumber
-1
. Inilah implementasinyaassert false : "TODO"; return -1;
Saya ingin menyebutkan bahwa setelah menerapkan
getItem
dangetItemId
Anda dapat menggunakan ListView.getItemAtPosition dan ListView.getItemIdAtPosition untuk langsung mengakses data Anda, alih-alih melalui adaptor. Ini mungkin sangat berguna ketika menerapkan pendengar onClick.sumber
Jika Anda menerapkan
getItemId
dengan benar maka itu mungkin sangat berguna.Contoh:
Anda memiliki daftar album:
Dan Anda menerapkan
getItemId
seperti ini:Sekarang id item Anda tergantung pada nilai-nilai coverUrl dan bidang judul dan jika Anda mengubahnya lalu memanggil
notifyDataSetChanged()
adaptor Anda, maka adaptor akan memanggil metode getItemId () dari setiap elemen dan memperbarui hanya item thouse yang id telah berubah.Ini sangat berguna jika Anda melakukan beberapa operasi "berat" di komputer Anda
getView()
.BTW: jika Anda ingin ini berfungsi, Anda perlu memastikan
hasStableIds()
metode Anda kembali salah;sumber
hasStableIds()
kembali salah? Sepertinya saya bahwa kode hash yang dihitung dari string yang sama akan mengembalikan nilai yang sama setiap kali, yang merupakan ID stabil menurut dokumen .getItem
ataugetItemId
beberapa metode yang terutama dirancang untuk data yang dilampirkan dengan item dalam daftar. Dalam hal inigetItem
, Anda dapat melewati objek apa pun yang akan dilampirkan ke item dalam daftar. Biasanya orang kembalinull
.getItemId
adalahlong
nilai unik apa pun yang dapat Anda lampirkan dengan item yang sama dalam daftar. Orang umumnya mengembalikan posisi dalam daftar.Apa gunanya. Nah, karena nilai-nilai ini terikat pada item dalam daftar, Anda dapat mengekstraknya ketika pengguna mengklik item tersebut. Nilai-nilai ini dapat diakses melalui
AdapterView
metode.sumber