为什么不能从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));