Szukam sposobu, aby ukryć jeden element w widżecie przędzarki Androida. Pozwoliłoby to na zasymulowanie pokrętła bez wybranych elementów i zapewniłoby, że wywołanie zwrotne onItemSelected () jest zawsze wywoływane dla każdego wybranego elementu (jeśli ukryty element jest elementem „bieżącym”). Zwykle w pokrętle zawsze znajduje się jeden element, który nie generuje wywołania zwrotnego, a mianowicie bieżący.
W przepływie stosu jest kod dotyczący wyłączania (wyszarzania) elementów, ale nie dotyczy tego, jak całkowicie ukryć elementy tak, jakby nie istniały.
Po wielu eksperymentach wymyśliłem nieco hakerskie rozwiązanie, które działa na różnych starych i nowych platformach Androida. Ma kilka drobnych wad kosmetycznych, które trudno zauważyć. Wciąż chciałbym usłyszeć o bardziej oficjalnym rozwiązaniu, innym niż „nie rób tego za pomocą błystki”.
To zawsze ukrywa pierwszy element w pokrętle, ale można go dość łatwo rozszerzyć, aby ukryć dowolny element lub więcej niż jeden element. Dodaj fikcyjny element zawierający pusty ciąg na początku listy elementów przewijanych. Możesz chcieć ustawić bieżący wybór pokrętła na pozycję 0, zanim otworzy się okno dialogowe pokrętła, co zasymuluje niezaznaczoną pokrętło.
Przykład konfiguracji Spinner z przesłonięciem metody 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);
linia jest niepotrzebna. Komentowanie tego nie wydaje się robić żadnej (wizualnej) różnicy, przynajmniej w systemie Android 4.4.2 / KitKit (na LG / Google Nexus 4).
setTag(1)
w textView pozycji 0, a następnie użyłem go convertView.getTag() != null
do określenia, czy ponownie użyty widok był widokiem wysokości 0 utworzonym dla pozycji 0, czy normalnym widokiem używanym dla innych elementów pokrętła. To było tak, że mogłem super.getDropDownView(position, convertView, parent)
czasami używać zamiast zawsze tworzyć nowy widok.