2010-07-19 16 views
13

Próbowałem dynamicznie aktualizować spinner w Androidzie, ale nic, co próbowałem, nie działa.Jak dynamicznie aktualizować spinner?

Jest to następujący kod, którego używam do aktualizowania pokrętła.

typeList = dbAdapter.getList(); //array list with the values 

adapter.notifyDataSetChanged(); 
groupSpinner.postInvalidate(); 
groupSpinner.setAdapter(adapter); 

Wartości typeList są poprawne, ale nie są aktualizowane w Spinner.

+0

i fi Po prostu stworzył zupełnie nowy adapter ... Czuję, że nie powinienem był tego robić. – 2Real

+0

Czy masz jedno wystąpienie adaptera. jeśli ponownie zainicjujesz adapter, funkcja notifyDataSetChanged nie działa. – user1154390

Odpowiedz

3

Czy istnieje literówka lub coś takiego? Jaka jest różnica między dbAdapter a adapter. Jeśli Spinner ma już adapter, nie musisz go ponownie przypisywać. Co więcej, jedyne, co musisz zrobić, to zaktualizować adapter i wywołać metodę notifyDataSetChanged.

typeList = adapter.getList(); //array list with the values 
// change the values, and then 
adapter.notifyDataSetChanged(); 
+0

dbAdapter to moje łącze do adaptera bazy danych to niestandardowy adapter, który rozszerza BaseAdapter i implementuje SpinnerAdapter. Próbowałem tego, co sugerowałeś i to nie działało. – 2Real

10

Wystarczy tylko zadzwonić setAdapter() raz zadzwonić adapter.notifyDataSetChanged() aby zaktualizować dane.

+0

Czy muszę utworzyć zupełnie nowy adapter, ponieważ to nie działa? Po kliknięciu pokrętła wartości na liście nie są aktualizowane. – 2Real

+12

Znalazłem 'NotifyDataSetChanger()' do pracy na listach, ale nie widziałem go działa w Spinners. Sądzę, że istnieje pewna różnica wewnętrzna, która wymaga utworzenia za każdym razem nowego adaptera. –

18

W rzeczywistości należy wywołać polecenie clear/add na adapterze lub utworzyć i ustawić nową kartę. Adapter nie zachowuje odwołania do twojej listy (wywołuje tylko Aarray na twojej liście w budowie), więc nie ma sposobu na jej aktualizację.

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList); 
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinnerCategory.setAdapter(dataAdapter); 
7

Gdy masz dane zmieniły się na liście i kiedy chcesz zaktualizować z tarczy następnie

Utwórz nowy obiekt adaptera i ustawić ten adapter do turbinki. Będzie działać pewnie.

Powodzenia.

Edytuj: Należy również wywołać metodę notifyDataSetChanged() na adapterze.

1

Zmień dane bazowe i wywołaj metodę notifyDataSetChanged() na adapterze.

list.clear(); 
    list.add("A"); 
     list.add("B"); 
    dataAdapter.notifyDataSetChanged(); 
1

Po zmianie swoich danych, trzeba będzie dodać następujący kod:

typeList = dbAdapter.getList()    
adapter = new ArrayAdapter<String>(v.getContext(), 
    android.R.layout.simple_spinner_dropdown_item,typeList);    
groupSpinner.setAdapter(adapter); 
0

Podobno po wykonaniu typeList = dbAdapter.getList() zmienna typeList punkty do innej listy, a nie ten, który wprowadza się do adapter początkowo i adapter byłyby nieco zdezorientowane.

Więc należy użyć następującego kodu:

typeList.clear(); 
typeList.addAll(dbAdapter.getList()); 
0

Po skonfigurowaniu adapter pokrętła dodać

spinnerAdapter.setNotifyOnChange(true); 

Odtąd po dodaniu nowych danych zostanie on automatycznie aktualizowane.

+0

Dla ArrayAdapter wartość domyślna jest już prawdą. Do użycia z Spinners, zrobienie tego nie ma żadnego efektu - jak wspomniano w komentarzach do poprzednich odpowiedzi. –

2

Nie można po prostu zmodyfikować oryginalny List następnie wywołać notifyDataSetChanged() jak na innych kartach, a nie trzymać się oryginalnego List.Jednakże, można osiągnąć ten sam efekt przy użyciu samego zasilacza, tak jak poniżej:

spinnerAdapter.clear(); 
spinnerAdapter.addAll(updatedListData); 
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default 

Na podstawie odpowiedzi z user392117 (https://stackoverflow.com/a/38738734/1508887)

+0

To powinna być zaakceptowana odpowiedź. – Smeet

0

apletu Dodaj/Usuń na karty i korzystania notifyDataSetChanged() pozwala uniknąć wielokrotnego tworzenia nowych adapterów.

stwierdzenie adaptera globalnego

ArrayAdapter<Object> adapter; 

Kiedy coś dodać do listy obiektów adapter jest dołączone do (smyczki lub jakiegokolwiek obiektu używasz) dodać funkcję dodawania do adaptera i nazywają notifyDataSetChanged:

adaper.add(Object); 
adapter.notifyDataSetChanged(); 

i kiedy usunąć element z listy dodać również:

adapter.remove(Object); 
adapter.notifyDataSetChanged();