2010-07-19 73 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();