2010-07-19 9 views
13

Я пытаюсь обновить свой счетчик в андроиде динамически, но ничего, что я пытаюсь, работает.Как обновить спиннер динамически?

Это следующий код, который я использую для обновления счетчика.

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

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

Значения typeList верны, но они не обновляются в Spinner.

+0

Я фи xed это только что создал целый новый адаптер ... Я чувствую, что мне не стоило этого делать. – 2Real

+0

У вас есть один экземпляр адаптера. если вы снова инициализируете свой адаптер, notifyDataSetChanged не работает. – user1154390

ответ

3

Есть ли опечатка или что-то в этом роде? В чем разница между dbAdapter и adapter. Если у Spinner уже есть адаптер, вам не нужно повторно назначать его. Более того, единственное, что вам нужно сделать, это обновить адаптер и вызвать метод notifyDataSetChanged.

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

dbAdapter - моя ссылка на адаптер базы данных - это пользовательский адаптер, который я сделал, который расширяет BaseAdapter и реализует SpinnerAdapter. Я попробовал то, что вы предложили, и это не сработало. – 2Real

10

Вам нужно только позвонить setAdapter() один раз, и вы называете adapter.notifyDataSetChanged() обновить данные.

+0

Мне нужно создать совершенно новый адаптер, потому что он не работает? Когда я нажимаю на счетчик, значения в списке не обновляются. – 2Real

+12

Я нашел 'NotifyDataSetChanger()' для работы в списках, но я не видел, чтобы он работал в Spinners. Я предполагаю, что существует некоторая внутренняя разница, которая требует, чтобы вы каждый раз создавали новый адаптер. –

18

На самом деле вам нужно либо позвонить, либо очистить/добавить на адаптер, либо создать и установить новый адаптер. Адаптер не сохраняет ссылку на ваш список (он только вызывает toArray в вашем списке при построении), поэтому нет возможности обновить его.

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

Если у вас есть данные, измененные в списке, и когда вы хотите обновить вертушку затем

Создать новый объект адаптера и установить, что адаптер к блесны. Он будет работать уверенно.

Удачи.

Редактировать: Также вам необходимо вызвать notifyDataSetChanged() на адаптере.

1

Измените базовые данные и вызовите адаптер notifyDataSetChanged().

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

После изменения данных, вам необходимо добавить следующий код:

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

Видимо после того, как вы typeList = dbAdapter.getList(), переменная typeList указывает на другой список, а не тот, который вы подаваемого адаптер первоначально, и адаптер будет несколько смущен.

Таким образом, вы должны использовать следующий код:

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

При настройке адаптера спиннера добавить

spinnerAdapter.setNotifyOnChange(true); 

С тех пор при добавлении новых данных будет автоматически обновлять.

+0

Для ArrayAdapter значение по умолчанию уже верно. Для использования со Spinners это не имеет никакого эффекта - как упоминалось в комментариях к предыдущим ответам. –

2

Вы не можете просто изменить оригинал List, а затем позвонить notifyDataSetChanged(), как на других адаптерах, так как он не удержит оригинала List.Тем не менее, вы можете достичь того же результата, используя сам адаптер, например, так:

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

На основании ответа от user392117 (https://stackoverflow.com/a/38738734/1508887)

+0

Это должен быть принятый ответ. – Smeet

0

Использование добавления/удаления на адаптере и используя notifyDataSetChanged() позволяет вам не создавать новые адаптеры снова и снова.

Объявить адаптер глобальной

ArrayAdapter<Object> adapter; 

Когда вы что-то добавить в список объектов адаптер прилагается к (Strings или любой другой объект, который вы используете) добавить функцию добавления к адаптеру и вызовите notifyDataSetChanged:

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

и при удалении элемента из списка, добавить:

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