2010-08-13 125 views
55

我正在使用一個ArrayAdapter<CharSequence>來填充項目以在android.widget.Spinner中列出。這一切都很好。爲什麼不能從ArrayAdapter添加/刪除項目?

但現在我想保持項目列表的動態,即我希望能夠在運行時從選擇列表中添加/刪除項目。然而,當我打電話給adapter.add(item)adapter.remove(item)時,我始終得到一個UnsupportedOperationException,儘管ArrayAdapter類的Javadocs將這兩種方法描述爲可用於完全達到預期目的。

這是一個錯誤,真的沒有實現,或者我在這裏錯過了什麼?

+1

我覺得一個片段可能會有幫助。 – 2010-08-13 12:26:44

+0

重複的[無法修改ListView中的ArrayAdapter](http://stackoverflow.com/questions/3200551/unable-to-modify-arrayadapter-in-listview) – blahdiblah 2013-02-08 00:51:29

回答

118

您可能已使用普通Java數組初始化適配器(例如,String[])。嘗試使用實現java.util.List界面的東西(例如,ArrayList<String>)。

+3

我使用ArrayList

,我得到'UnsupportedOperationException' 。表單是一個自定義類。 – VansFannel 2012-04-18 10:46:08

+10

這應該是公認的答案。 – 2012-10-24 11:42:42

+2

除了使用返回只讀ArrayList的Arrays.asList。查看Zeratul的答案 – andrei 2015-09-11 13:13:23

16

這裏是ArrayAdapter#remove源代碼:

public void remove(T object) { 
    if (mOriginalValues != null) { 
     synchronized (mLock) { 
      mOriginalValues.remove(object); 
     } 
    } else { 
     mObjects.remove(object); 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

,可以拋出UnsupportedOperationException存在else區塊行的唯一的事。所以問題是你使用的列表不支持刪除項目。我的猜測是你正在使用一個數組。例如,嘗試一個ArrayList。

編輯:所以是的,有什麼馬克說...

20

我知道它的晚,但只是一個快速的解釋:這是因爲方法Arrays.asList(T ...陣列)返回名爲定製內部類ArrayList只讀。如前所述,您需要提供完整的impl。例如java.util.ArrayList中。

12

我遇到了同樣的問題,我的數據保存在資源字符串數組中,所以我創建的ArraAdapter與createFromResource
從資源字符串數組創建ArrayAdapter下面的代碼解決了這個問題:

Resources res = getResources(); 
String[] cities = res.getStringArray(R.array.cities_array); 
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
    this, 
    android.R.layout.simple_spinner_item, 
    new ArrayList(Arrays.asList(cities))); 
+0

這也適用於我。謝謝! – Malu 2015-11-15 14:18:13

3

在您的適配器類 - 刪除項目

remove(position); 
notifyDataSetChanged(); 

添加項目 -

adapter.add (newItem); 
adapter.notifyDataSetChanged(); 
0

可能,您正在使用您的ArrayAdapter類中的列表而不是ArrayList

試試你的陣列或列表轉換爲的ArrayList -

new ArrayList<ClassType>(Arrays.asList(array)); 
相關問題