Di antarmuka pengguna harus ada pemintal yang berisi beberapa nama (nama terlihat) dan setiap nama memiliki ID sendiri (ID tidak sama dengan urutan tampilan). Ketika pengguna memilih nama dari daftar, variabel currentID harus diubah.
Aplikasi ini berisi ArrayList
Di mana Pengguna adalah objek dengan ID dan nama:
public class User{
public int ID;
public String name;
}
Yang tidak saya ketahui adalah cara membuat pemintal yang menampilkan daftar nama pengguna dan mengikat item pemintal ke ID sehingga ketika item pemintal dipilih / diubah variabel currentID diatur ke nilai yang sesuai.
Saya akan sangat menghargai jika ada yang bisa menunjukkan solusi dari masalah yang dijelaskan atau memberikan tautan apa pun yang berguna untuk menyelesaikan masalah.
Terima kasih!
Jawaban:
Anda dapat melihat jawaban ini . Anda juga dapat menggunakan adaptor khusus, tetapi solusi di bawah ini baik untuk kasus sederhana.
Berikut ini kiriman ulang:
Jadi jika Anda datang ke sini karena Anda ingin memiliki label dan nilai di Spinner - inilah cara saya melakukannya:
Spinner
seperti biasaarray.xml
file Anda - satu array untuk label, satu array untuk nilaiSpinner
dengan Andaandroid:entries="@array/labels"
Saat Anda membutuhkan nilai, lakukan sesuatu seperti ini (tidak, Anda tidak perlu mengaitkannya):
sumber
Saya tahu utasnya sudah tua, tetapi untuk berjaga-jaga ...
Objek pengguna:
Adaptor Spinner Kustom (ArrayAdapter)
Dan implementasinya:
sumber
Skipped 317 frames! The application may be doing too much work on its main thread.
Ada ide?Solusi paling sederhana
Setelah menjelajahi berbagai solusi pada SO, saya menemukan yang berikut ini sebagai solusi paling sederhana dan terbersih untuk mengisi
Spinner
dengan kebiasaanObjects
. Inilah implementasi lengkapnya:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
Dalam Aktivitas Anda
sumber
currentID
segera setelah nilai Spinner berubah. Sebagian besar waktu Anda hanya memerlukan nilai Spinner setelah menekan tombol, seperti Kirim atau Simpan , tidak segera setelah Spinner berubah dan jika dapat dihindari, ini memberikan solusi yang lebih sederhana.getSelectedItem()
panggilan itu. Terima kasih atas tipnya.Untuk solusi sederhana, Anda bisa menimpa "toString" di objek Anda
dan kemudian Anda dapat menggunakan:
Dengan cara ini pemintal Anda hanya akan menampilkan nama pengguna.
sumber
Sejauh ini cara paling sederhana yang saya temukan:
Sekarang Anda dapat menempelkan objek apa pun di pemintal Anda, dan itu akan menampilkan label yang ditentukan.
sumber
Hanya sedikit perubahan pada jawaban Joaquin Alberto yang dapat menyelesaikan masalah gaya. Cukup ganti fungsi getDropDownView di adaptor khusus seperti di bawah ini,
sumber
Bekerja dengan baik untuk saya, kode yang diperlukan di sekitar getResource () adalah sebagai berikut:
Hanya perlu memastikan (sendiri) nilai-nilai dalam dua array disejajarkan dengan benar!
sumber
terinspirasi oleh Joaquin Alberto, ini bekerja untuk saya:
sumber
Berdasarkan sampel Joaquin Alberto (terima kasih), tetapi itu bekerja untuk semua jenis (Anda harus menerapkan toString () dalam jenis, sehingga Anda dapat memformat output.
Juga saya pikir Anda dapat mengganti Daftar dengan Array sehingga Anda tidak perlu melakukan toArray di Daftar, tetapi saya punya Daftar ..... :)
sumber
Untuk memahami triknya, kita harus tahu, bagaimana Adapters bekerja secara umum dan ArrayAdapter secara khusus.
Adapters: adalah objek yang dapat mengikat struktur data ke widget, maka widget ini menampilkan data itu dalam Daftar atau dalam Spinner.
Jadi dua pertanyaan yang dijawab Adaptor adalah:
EditText
tampilan widget atau komposit menurut data ini?Jawaban ArrayAdapter adalah:
row.xml
ATAUandroid.R.layout.simple_spinner_item
) untuk indeks apa pun adalah sama, dan meningkat dari sumber daya yang IDnya diberikan kepada konstruktor ArrayAdapter..setText()
akan digunakan dengan format string dari item dalam struktur data pendukung. Format string akan diperoleh dengan memohon.toString()
pada item.CustomListViewDemo.java
aturan_content.xml
main.xml
Ini berfungsi dengan baik, semoga bermanfaat.
sumber
Obyek kustom saya adalah
Saya juga ingin mengatur objek ini sebagai sumber adaptor saya ke pemintal saya tanpa memperluas ArrayAdapter sehingga apa yang saya lakukan adalah.
Sekarang Anda akan dapat melihat hasil di pemintal Anda, triknya adalah untuk menimpa objek kustom
toString()
Anda , jadi nilai apa pun yang ingin Anda tampilkan di pemintal cukup kembalikan dalam metode ini.sumber
Saya pikir solusi terbaik adalah "Solusi Sederhana" oleh Josh Pinter .
Ini bekerja untuk saya:
sumber
Jika Anda tidak memerlukan kelas yang terpisah, maksud saya hanya adaptor sederhana yang dipetakan pada objek Anda. Ini kode saya berdasarkan fungsi ArrayAdapter yang disediakan.
Dan karena Anda mungkin perlu menambahkan item setelah pembuatan adaptor (mis. Pemuatan basis data item asinkron).
Sederhana namun efisien.
Dan kemudian Anda dapat menggunakan kode ini (saya tidak bisa memasukkan Category [] dalam konstruktor adaptor karena data dimuat secara terpisah).
Perhatikan bahwa adaptor.addAll (item) menyegarkan pemintal dengan memanggil notifyDataSetChanged () di internal.
sumber
Melakukan:
sumber