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

mmo*_*mmo 57 android android-widget android-2.2-froyo

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

但现在我想保持项目列表动态,即我希望能够在运行时添加/删除选择列表中的项目.但是,当我打电话adapter.add(item)或者adapter.remove(item)我总是得到一个时UnsupportedOperationException,即使ArrayAdapter该类的Javadocs 描述这两种方法可用于完全用于预期目的.

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

Com*_*are 119

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

  • 我正在使用ArrayList <Form>,我得到`UnsupportedOperationException`.表单是一个自定义类. (4认同)
  • 除非使用返回只读ArrayList的Arrays.asList.请参阅下面的Zeratul的答案 (2认同)

zer*_*021 21

我知道它已经晚了但只是一个简单的解释:因为方法Arrays.asList(T ... array)返回名为ArrayList的自定义内部类,它是只读的.如前所述,您需要提供完整的impl.例如java.util.ArrayList.


ben*_*nvd 16

这是源代码ArrayAdapter#remove:

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

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

编辑:是的,马克说的......


use*_*503 13

我遇到了同样的问题,我的数据保存在资源字符串数组中,所以我用createFromResource创建了ArraAdapter.
以下用于从资源String Array创建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)));
Run Code Online (Sandbox Code Playgroud)