2010-08-13 31 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)); 
相关问题