Я шукаю спосіб приховати один елемент у віджеті спінера Android. Це дозволить вам імітувати спінер без вибраних елементів та гарантує, що зворотний виклик onItemSelected () завжди викликається для кожного обраного елемента (якщо прихований елемент є "поточним"). Зазвичай у спінері завжди є один елемент, який не генерує зворотний дзвінок, а саме поточний.
У stackoverflow є якийсь код, як відключити (витіснити) елементи, але не як повністю приховати елементи так, ніби їх не існує.
Після довгих експериментів я придумав дещо зламане рішення, яке працює на різних старих і нових платформах Android. У нього є незначні косметичні недоліки, які важко помітити. Я все ще хотів би почути більш офіційне рішення, окрім "не робіть цього зі спінером".
Це завжди ховає перший елемент у прядильній машині, але його можна досить легко розширити, щоб приховати довільний предмет або більше одного елемента. Додайте фіктивний елемент, що містить порожній рядок, на початку списку елементів спінеру. Ви можете встановити поточний вибір спінера на пункт 0 до того, як відкриється діалогове вікно спінера, це буде імітувати невибраний спінер.
Приклад налаштування Spinner з методом 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);
лінія не потрібна. Коментуючи це, схоже, не має жодної (візуальної) різниці, принаймні, на Android 4.4.2 / KitKit (для LG / Google Nexus 4).
setTag(1)
textView у позиції 0, а потім convertView.getTag() != null
визначав, чи повторно використаний вид був переглядом висоти 0, створеним для позиції 0, або звичайним видом, який використовується для інших елементів спінера. Це було так, що я міг super.getDropDownView(position, convertView, parent)
іноді використовувати, а не завжди створювати новий погляд.