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 digunakan convertView.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 saya super.getDropDownView(position, convertView, parent)
terkadang dapat menggunakan alih-alih selalu membuat tampilan baru.