Saya mencari cara untuk menyembunyikan satu item di widget spinner Android. Ini akan memungkinkan Anda untuk menyimulasikan spinner tanpa item yang dipilih, dan memastikan bahwa callback onItemSelected () selalu dipanggil untuk setiap item yang dipilih (jika item yang disembunyikan adalah yang "saat ini"). Biasanya selalu ada satu item di spinner yang tidak menghasilkan callback, yaitu item saat ini.
Ada beberapa kode di stackoverflow tentang cara menonaktifkan item (berwarna abu-abu), tetapi bukan cara menyembunyikan item sepenuhnya seolah-olah tidak ada.
Setelah banyak bereksperimen, saya menemukan solusi yang agak hack-ish yang berfungsi pada berbagai platform Android lama dan baru. Ini memiliki beberapa kekurangan kosmetik kecil yang sulit untuk diperhatikan. Saya masih ingin mendengar solusi yang lebih resmi, selain "jangan lakukan itu dengan pemintal".
Ini selalu menyembunyikan item pertama di spinner, tetapi dapat dengan mudah diperpanjang untuk menyembunyikan item arbitrer atau lebih dari satu item. Tambahkan item dummy yang berisi string kosong di awal daftar item spinner Anda. Anda mungkin ingin menyetel pilihan spinner saat ini ke item 0 sebelum dialog spinner terbuka, ini akan menyimulasikan spinner yang tidak dipilih.
Contoh penyiapan spinner dengan penggantian metode ArrayAdapter:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
garis itu tidak perlu. Mengomentarinya sepertinya tidak membuat perbedaan (visual) apa pun, setidaknya di Android 4.4.2 / KitKit (di LG / Google Nexus 4).setTag(1)
textView di posisi 0, lalu digunakanconvertView.getTag() != null
untuk menentukan apakah tampilan yang digunakan kembali adalah tampilan 0 ketinggian yang dibuat untuk posisi 0 atau tampilan normal yang digunakan untuk item spinner lainnya. Ini agar sayasuper.getDropDownView(position, convertView, parent)
terkadang dapat menggunakan alih-alih selalu membuat tampilan baru.Jawaban:
Untuk menyembunyikan item sewenang-wenang atau lebih dari satu item, saya pikir Anda dapat menerapkan adaptor Anda sendiri dan mengatur indeks (atau daftar indeks array) yang ingin Anda sembunyikan.
Dan gunakan adaptor kustom Anda saat Anda membuat daftar item.
(Saya belum menguji kodenya) harapan yang membantu.
sumber
Lebih mudah menyembunyikan item di akhir daftar dengan memotong daftar.
Tetapi Anda harus memilihnya terlebih dahulu agar muncul di spinner, lalu periksa apakah pilihan telah diubah ke salah satu item yang ditampilkan.
sumber
Untuk menyembunyikan item apa pun di dropdown spinner, Anda harus meneruskan posisi item yang perlu disembunyikan berdasarkan kriteria yang diperlukan. Saya telah mencapai ini dalam kasus penggunaan menyembunyikan item yang dipilih dari dropdown
Dan pengaturan adaptor adalah seperti ini
Saat memilih beberapa item dari dropdown juga posisinya perlu diubah
sumber
Hanya untuk kepentingan, saya membuat solusi untuk menggunakan "Prompt" sebagai petunjuk. Kode ini dibuat untuk
Xamarin.Android
, tetapi dapat dengan sempurna diporting ke Java dalam 10 menit. Gunakan seperti sederhanaArrayAdapter
tanpa menambahkan item yang diindeks 0 atau diindeks hitungan ke larik sumber. Ini juga disetelSpinnerGeolocation.SelectedItemId
ke -1 ketika tidak ada yang dipilih (hint
adalah item saat ini).sumber
Saya menemukan solusi ini yang memecahkan masalah saya.
sumber
Saya pikir akan lebih baik untuk menempatkan validasi di Array List daripada di Spinner karena setelah item disaring, akan aman untuk ditambahkan di Spinner
sumber
Pendekatan lain yang paling berhasil bagi saya adalah mengembalikan objek tampilan kosong baru. Ini adalah pendekatan yang sangat bersih karena Anda tidak bermain-main dengan elemen array.
Buat ekstensi kelas adaptor Anda
ArrayAdapter
di dalam metode Anda
sumber
Ini adalah pertanyaan yang sangat lama tetapi saya telah menemukan cara yang bagus (dan mungkin) bersih untuk tidak menampilkan item pertama juga. Terinspirasi oleh jawaban @ Romich, saya telah menambahkan logika serupa untuk melewati item pertama.
Ini secara efektif menyembunyikan sejumlah item (1 secara default). Kode hanya melaporkan ukuran objek yang akan dirender menjadi lebih pendek dari yang sebenarnya dan juga mengubah indeks item yang akan dirender sehingga kami melewatkan jumlah item yang berubah-ubah.
Untuk mempermudah, saya telah mengecualikan solusi yang saat ini saya gunakan yang mendukung menyembunyikan daftar item acak, tetapi itu dapat dengan mudah dikelola dengan beberapa penyesuaian pada kode.
sumber