33

我一直在尝试动态更新我在 android 中的微调器,但我没有尝试过任何工作。

这是我用来更新微调器的以下代码。

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

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

typeList 的值是正确的,但它们没有在 Spinner 中更新。

4

10 回答 10

30

实际上,您要么必须在适配器上调用 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);
于 2010-07-20T03:55:53.800 回答
28

您不能像在其他适配器上一样直接修改原始List然后调用notifyDataSetChanged(),因为它不会保留原始List.

但是,您可以使用适配器本身实现相同的结果,如下所示:

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

基于来自 user392117的这个答案。

编辑:默认情况下,更改列表的方法喜欢add()remove()自动调用notifyDataSetChanged()(请参阅Android 开发人员文档中的 setNotifyOnChange(boolean)

公共无效 setNotifyOnChange (boolean notifyOnChange)

控制更改列表的方法(add、addAll(java.util.Collection)、addAll(java.lang.Object[])、insert、remove、clear、sort(java.util.Comparator))是否自动调用 notifyDataSetChanged。如果设置为 false,调用者必须手动调用 notifyDataSetChanged() 以使更改反映在附加视图中。默认值为 true,调用 notifyDataSetChanged() 会将标志重置为 true。

所以你不应该notifyDataSetChanged()每次都打电话。如果你发现是这种情况,你可以使用 setNotifyOnChange(true)

spinnerAdapter.setNotifyOnChange(true); //only need to call this once
spinnerAdapter.add(Object); //no need to call notifyDataSetChanged()
于 2017-02-05T22:04:34.023 回答
13

您只需要调用一次 setAdapter() 并调用adapter.notifyDataSetChanged()来更新数据。

于 2010-07-19T17:27:18.707 回答
11

当您在列表中更改数据并且想要更新微调器时

创建适配器的新对象并将该适配器设置为微调器。它肯定会起作用。

祝你好运。

编辑:您还需要在适配器上调用 notifyDataSetChanged() 。

于 2012-01-01T13:00:22.720 回答
4

有错字还是什么?dbAdapter和之间有什么区别adapter。如果 Spinner 已经有适配器,则不必重新分配它。此外,您唯一需要做的就是更新适配器和调用notifyDataSetChanged方法。

typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
于 2010-07-19T17:26:07.070 回答
3

在适配器上使用 add/remove 并使用 notifyDataSetChanged() 使您不必一遍又一遍地创建新的适配器。

全局声明你的适配器

ArrayAdapter<Object> adapter;

当您将某些内容添加到适配器附加到的对象列表(字符串或您使用的任何对象)时,向适配器添加一个添加函数并调用 notifyDataSetChanged:

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

当您从列表中删除项目时,还添加:

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

编辑:默认情况下,像 add() 和 remove() 这样更改列表的方法会自动调用 notifyDataSetChanged() (请参阅Android 开发人员文档中的 setNotifyOnChange(boolean)

公共无效 setNotifyOnChange (boolean notifyOnChange)

控制更改列表的方法(add、addAll(java.util.Collection)、addAll(java.lang.Object[])、insert、remove、clear、sort(java.util.Comparator))是否自动调用 notifyDataSetChanged。如果设置为 false,调用者必须手动调用 notifyDataSetChanged() 以使更改反映在附加视图中。默认值为 true,调用 notifyDataSetChanged() 会将标志重置为 true。

所以你不需要每次都调用 notifyDataSetChanged() 。如果您发现是这种情况,您可以使用 setNotifyOnChange(true)

adapter.setNotifyOnChange(true); //only need to call this once
adapter.add(Object); //no need to call notifyDataSetChanged()
于 2017-07-19T13:43:22.307 回答
2

更改数据后,您需要添加以下代码:

typeList = dbAdapter.getList()              
adapter = new ArrayAdapter<String>(v.getContext(),
    android.R.layout.simple_spinner_dropdown_item,typeList);            
groupSpinner.setAdapter(adapter);
于 2014-02-25T17:04:23.513 回答
2

更改底层数据并调用适配器上的 notifyDataSetChanged()。

   list.clear();
  list.add("A");
      list.add("B");
  dataAdapter.notifyDataSetChanged();
于 2012-03-25T10:48:39.287 回答
1

显然,在您这样做之后typeList = dbAdapter.getList(),变量typeList指向不同的列表,而不是您最初提供给适配器的列表,并且适配器会有些混乱。

所以你应该使用下面的代码:

typeList.clear();
typeList.addAll(dbAdapter.getList());
于 2015-05-27T16:18:57.577 回答
1

当您设置微调器适配器时,添加

spinnerAdapter.setNotifyOnChange(true);

从那时起,当您添加新数据时,它将自动更新。

于 2016-11-16T15:01:12.280 回答