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 goconvertView.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łemsuper.getDropDownView(position, convertView, parent)
czasami używać zamiast zawsze tworzyć nowy widok.Odpowiedzi:
Aby ukryć dowolny element lub więcej niż jeden element, myślę, że możesz zaimplementować własny adapter i ustawić indeks (lub tablicę indeksów), który chcesz ukryć.
Podczas tworzenia listy elementów użyj własnego adaptera.
(Nie testowałem kodu) mam nadzieję, że to pomoże.
źródło
Łatwiej jest ukryć element na końcu listy, skracając listę.
Ale musisz go najpierw zaznaczyć, aby pojawił się w pokrętle, a następnie sprawdzić, czy wybór został zmieniony na jeden z wyświetlonych elementów.
źródło
Aby ukryć dowolny element w rozwijanym menu spinner, musisz podać pozycję elementu, który ma być ukryty na podstawie wymaganych kryteriów. Osiągnąłem to w przypadku użycia ukrywania elementu, który jest wybrany z listy rozwijanej
A ustawienie adaptera wygląda jakoś tak
Po wybraniu niektórych pozycji z listy rozwijanej również pozycja musi ulec zmianie
źródło
Dla zainteresowania stworzyłem rozwiązanie polegające na użyciu „Prompt” jako podpowiedzi. Ten kod jest przeznaczony
Xamarin.Android
, ale można go doskonale przenieść na Javę w 10 minut. Używaj go jak prostego,ArrayAdapter
bez dodawania elementów indeksowanych 0 lub zliczanych do tablicy źródłowej. Ustawia się równieżSpinnerGeolocation.SelectedItemId
na -1, gdy nic nie jest wybrane (hint
jest to bieżąca pozycja).źródło
Znalazłem to rozwiązanie, które rozwiązało mój problem.
źródło
Myślę, że lepiej będzie umieścić walidację na liście Array zamiast na Spinner, ponieważ po przefiltrowaniu elementu będzie można bezpiecznie dodać w Spinner
źródło
Innym podejściem, które działało najlepiej, jest zwrócenie nowego pustego obiektu widoku. Jest to dość czyste podejście, ponieważ nie bawisz się elementami tablicy.
Utwórz rozszerzającą klasę adaptera
ArrayAdapter
wewnątrz twojej metody
źródło
To bardzo stare pytanie, ale znalazłem ładny (i prawdopodobnie) czysty sposób, aby nie pokazywać również pierwszych pozycji. Zainspirowany odpowiedzią @ Romicha, dodałem podobną logikę, aby pominąć pierwszą pozycję (y).
To skutecznie ukrywa dowolną liczbę elementów (domyślnie 1). Kod zgłasza tylko rozmiar obiektów do renderowania jako krótszy niż jest w rzeczywistości, a także zmienia indeks elementów do renderowania, więc pomijamy dowolną liczbę elementów.
Aby uprościć sprawę, wykluczyłem rozwiązanie, którego obecnie używam, które obsługuje ukrywanie listy losowych elementów, ale można nim łatwo zarządzać za pomocą kilku poprawek w kodzie.
źródło