2010-07-19 48 views
13

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

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

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

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

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

+0

我科幻通过创建一个全新的适配器来实现这一点......我觉得我不应该这样做。 – 2Real 2010-07-19 17:56:57

+0

你有一个适配器的实例吗?如果再次初始化适配器,notifyDataSetChanged不起作用。 – user1154390 2014-11-10 12:16:44

回答

3

是否有错字或什么? dbAdapteradapter之间的区别是什么?如果Spinner已经有适配器,则不必重新分配它。更重要的是,唯一需要做的就是更新适配器并调用notifyDataSetChanged方法。

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

dbAdapter是我的数据库适配器的链接,是我做的扩展BaseAdapter并实现SpinnerAdapter的自定义适配器。我尝试了你的建议,但没有奏效。 – 2Real 2010-07-19 17:41:00

10

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

+0

我是否需要创建一个全新的适配器,因为这不起作用?当我单击微调框时,列表中的值不会更新。 – 2Real 2010-07-19 17:31:44

+12

我发现'NotifyDataSetChanger()'在列表中工作,但我没有看到它在Spinners中的工作。我想有一些内部的差异,需要你每次创建一个新的适配器。 – 2013-10-15 20:13:58

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指向不同的列表,而不是你输入到1最初的适配器和适配器会有些困惑。

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

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

当您设置微调适配器添加

spinnerAdapter.setNotifyOnChange(true); 

从此当你添加它会自动更新新数据。

+0

对于ArrayAdapter,默认值已为true。为了与Spinners一起使用,这样做不会产生任何影响 - 正如前面回答的评论中所述。 – 2017-02-05 21:55:33

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 2017-11-14 08:55:35

0

答案使用添加/删除,并使用notifyDataSetChanged()使您不必一次又一次地创建新的适配器。

当你添加一些东西到适配器连接到(字符串或任何对象使用)的对象列表中添加一个附加功能,适配器和调用notifyDataSetChanged声明适配器全球

ArrayAdapter<Object> adapter; 

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

,当你从列表中删除的项目添加也:

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