W interfejsie użytkownika musi znajdować się spinner, który zawiera nazwy (nazwy są widoczne), a każda nazwa ma swój własny identyfikator (identyfikatory nie są równe kolejności wyświetlania). Kiedy użytkownik wybierze nazwę z listy, zmienna currentID musi zostać zmieniona.
Aplikacja zawiera ArrayList
Gdzie Użytkownik jest obiektem o identyfikatorze i nazwie:
public class User{
public int ID;
public String name;
}
Nie wiem, jak utworzyć pokrętło, które wyświetla listę nazw użytkowników i powiązać elementy pokrętła z identyfikatorami, więc po wybraniu / zmianie elementu pokrętła zmienna currentID jest ustawiana na odpowiednią wartość.
Byłbym wdzięczny, gdyby ktoś mógł pokazać rozwiązanie opisanego problemu lub podać jakikolwiek link przydatny do rozwiązania problemu.
Dzięki!
Odpowiedzi:
Możesz spojrzeć na tę odpowiedź . Możesz także użyć niestandardowego adaptera, ale poniższe rozwiązanie jest dobre w prostych przypadkach.
Oto ponowna wiadomość:
Więc jeśli przyszedłeś tutaj, ponieważ chcesz mieć zarówno etykiety, jak i wartości w Spinner - oto jak to zrobiłem:
Spinner
zwykły sposóbarray.xml
pliku 2 tablice o jednakowych rozmiarach - jedną tablicę dla etykiet, jedną tablicę dla wartościSpinner
zandroid:entries="@array/labels"
Kiedy potrzebujesz wartości, zrób coś takiego (nie, nie musisz jej łączyć):
źródło
Wiem, że wątek jest stary, ale na wszelki wypadek ...
Obiekt użytkownika:
Niestandardowy adapter tarczy (ArrayAdapter)
I implementacja:
źródło
Skipped 317 frames! The application may be doing too much work on its main thread.
jakieś pomysły?Najprostsze rozwiązanie
Po przeszukaniu różnych rozwiązań w SO, stwierdziłem, że najprostszym i najczystszym rozwiązaniem do wypełniania
Spinner
niestandardowegoObjects
. Oto pełna realizacja:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
W Twojej aktywności
źródło
currentID
natychmiast po zmianie wartości Spinner . W większości przypadków wartość Spinner jest potrzebna tylko po kolejnym naciśnięciu przycisku, takiego jak Prześlij lub Zapisz , a nie natychmiast po zmianie Spinnera, a jeśli można tego uniknąć, zapewnia to znacznie prostsze rozwiązanie.getSelectedItem()
wywołanie. Dzięki za wskazówkę.Aby uzyskać proste rozwiązania, możesz po prostu nadpisać „toString” w swoim obiekcie
a następnie możesz użyć:
W ten sposób twój spinner pokaże tylko nazwy użytkowników.
źródło
Zdecydowanie najprostszy sposób, jaki znalazłem:
Teraz możesz włożyć dowolny przedmiot do tarczy, a wyświetli on określoną etykietę.
źródło
Wystarczy drobna poprawka do odpowiedzi Joaquina Alberto, aby rozwiązać problem ze stylem. Po prostu zastąp funkcję getDropDownView w niestandardowym adapterze, jak poniżej,
źródło
U mnie działa dobrze, kod potrzebny wokół funkcji getResource () jest następujący:
Wystarczy upewnić się (samodzielnie), że wartości w obu tablicach są odpowiednio wyrównane!
źródło
zainspirowany Joaquinem Alberto, zadziałał dla mnie:
źródło
Oparty na przykładzie Joaquina Alberto (dzięki), ale działa dla każdego typu (powinieneś zaimplementować toString () w typie, więc możesz sformatować wynik.
Myślę też, że możesz zamienić List na Array, więc nie musisz robić toArray in List, ale mam List ..... :)
źródło
Aby zrozumieć sztuczkę, trzeba wiedzieć, jak ogólnie działają Adaptery, a w szczególności ArrayAdapter.
Adaptery: to obiekty, które są w stanie wiązać struktury danych z widżetami, wtedy te widgety wyświetlają te dane na liście lub w Spinnerze.
Tak więc dwa pytania, na które odpowiada Adapter, to:
EditText
. Widżetu lub widoku złożonego na podstawie tych danych?Odpowiedzi ArrayAdapter to:
row.xml
ORandroid.R.layout.simple_spinner_item
) dla dowolnego indeksu jest taki sam i jest zawyżany z zasobu, którego identyfikator został przekazany konstruktorowi ArrayAdapter..setText()
zostanie użyta z formatem ciągu elementu we wspierającej strukturze danych. Format ciągu zostanie uzyskany przez wywołanie.toString()
elementu.CustomListViewDemo.java
adaptor_content.xml
main.xml
Działa poprawnie, mam nadzieję, że przyda się.
źródło
Mój niestandardowy obiekt to
Chciałem również ustawić ten obiekt jako źródło mojego adaptera do mojego spinnera bez rozszerzania ArrayAdapter, aby to, co zrobiłem, było.
Teraz będziesz mógł zobaczyć wyniki w swojej tarczy, sztuczka polegała na nadpisaniu
toString()
w swoim niestandardowym obiekcie , więc jakąkolwiek wartość chcesz wyświetlić w przędzarce, po prostu zwróć ją w tej metodzie.źródło
Myślę, że najlepszym rozwiązaniem jest „najprostszym rozwiązaniem” przez Josh Pintera .
To zadziałało dla mnie:
źródło
Jeśli nie potrzebujesz oddzielnej klasy, mam na myśli zwykły adapter zmapowany na twoim obiekcie. Oto mój kod oparty na dostarczonych funkcjach ArrayAdapter.
A ponieważ może być konieczne dodanie elementu po utworzeniu adaptera (np. Asynchroniczne ładowanie elementu bazy danych).
Proste, ale wydajne.
A potem możesz użyć tego kodu (nie mogłem umieścić Category [] w konstruktorze adaptera, ponieważ dane są ładowane oddzielnie).
Zauważ, że adapter.addAll (items) odświeża spinner, wywołując notifyDataSetChanged () w wewnętrznym.
źródło
Robić:
źródło