Как динамически обновить счетчик? - PullRequest
23 голосов
/ 19 июля 2010

Я пытался динамически обновить мой счетчик в Android, но все, что я пытался, не работало.

Этот код используется для обновления счетчика.

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

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

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

Ответы [ 10 ]

22 голосов
/ 20 июля 2010

На самом деле, вам нужно либо вызвать clear / add на адаптере, либо создать и установить новый адаптер.Адаптер не сохраняет ссылку на ваш список (он только вызывает 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);
12 голосов
/ 06 февраля 2017

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

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

На основе ответа пользователя 392117 (https://stackoverflow.com/a/38738734/1508887)

12 голосов
/ 19 июля 2010

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

8 голосов
/ 01 января 2012

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

Создайте новый объект адаптера и установите этот адаптер на вертушка. Это будет работать точно.

Удачи.

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

4 голосов
/ 19 июля 2010

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

typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
1 голос
/ 25 февраля 2014

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

typeList = dbAdapter.getList()              
adapter = new ArrayAdapter<String>(v.getContext(),
    android.R.layout.simple_spinner_dropdown_item,typeList);            
groupSpinner.setAdapter(adapter);
1 голос
/ 25 марта 2012

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

   list.clear();
  list.add("A");
      list.add("B");
  dataAdapter.notifyDataSetChanged();
0 голосов
/ 19 июля 2017

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

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

ArrayAdapter<Object> adapter;

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

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

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

adapter.remove(Object);
adapter.notifyDataSetChanged();
0 голосов
/ 16 ноября 2016

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

spinnerAdapter.setNotifyOnChange(true);

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

0 голосов
/ 27 мая 2015

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

Поэтому вам следует использоватьследующий код:

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