为什么不能从ArrayAdapter中添加/删除项目?

我正在使用一个ArrayAdapter<CharSequence>来填充要在android.widget.Spinner列出的项目。 这工作都很好。

但现在我想保持项目的dynamic列表,即我希望能够在运行时从select列表中添加/删除项目。 然而,当我调用adapter.add(item)adapter.remove(item)我总是得到一个UnsupportedOperationException adapter.remove(item) ,尽pipeArrayAdapter类的Javadocs将这两种方法描述为可用于完全达到预期的目的。

这是一个错误,真的没有实现,或者我在这里错过了什么?

您可能使用普通的Java数组(例如, String[] )初始化适配器。 尝试使用实现java.util.List接口的东西(例如, ArrayList<String> )。

我知道这是晚了,但只是一个快速的解释:这是因为方法Arrays.asList(T …数组)返回自定义内部类名为ArrayList只读的 。 如前所述,您需要提供完整的impl。 比如java.util.ArrayList。

以下是ArrayAdapter#remove的源代码:

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

唯一可以抛出UnsupportedOperationException是else-block中的行。 所以问题是你使用的列表不支持删除项目。 我的猜测是你正在使用一个数组。 尝试一个ArrayList,例如。

编辑:那么,马克说什么…

我遇到了同样的问题,我的数据保存在资源string数组中,所以我使用createFromResource创build了ArraAdapter
下面的代码从资源string数组中创buildArrayAdapter解决了这个问题:

 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))); 

在你的适配器类中 – 删除一个项目

 remove(position); notifyDataSetChanged(); 

添加一个项目 –

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

可能,你在你的ArrayAdapter类而不是ArrayList中使用List。

尝试转换您的数组或列表ArrayList

 new ArrayList<ClassType>(Arrays.asList(array));