57

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

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

这是一个错误,真的没有实现还是我在这里遗漏了什么?

4

8 回答 8

120

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

于 2010-08-13T12:26:23.807 回答
22

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

于 2011-08-26T12:04:24.717 回答
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。

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

于 2010-08-13T12:28:45.627 回答
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)));
于 2012-06-14T20:20:03.567 回答
2

在您的适配器类中 - 删除一个项目

remove(position);
notifyDataSetChanged();

添加项目 -

adapter.add (newItem);
adapter.notifyDataSetChanged ();
于 2012-09-10T02:32:41.110 回答
1

可能,您在ArrayAdapter类中使用 List 而不是ArrayList

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

new ArrayList<ClassType>(Arrays.asList(array));
于 2017-11-08T05:42:06.803 回答
0

我的噩梦是从ArrayAdapter<String>. 由于这种现象,我已经避免使用这种方法将近 6 年了 :(

我的适配器是:

 private class MyAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final Bitmap[] slike;
    private final String[] nazivi;
    private final String[] grad_freq;
    private final boolean[] omiljeni;

    MyAdapter (Context c, Bitmap[] slike, String[] nazivi, String[] grad_freq, boolean[] omiljeni) {
        super(c, R.layout.row, R.id.textView1, nazivi);
        this.context = c;
        this.slike = slike;
        this.nazivi = nazivi;
        this.grad_freq= grad_freq;
        this.omiljeni = omiljeni;
    }
// ...
}

现在,它看起来像:

 private class MyAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final ArrayList<Bitmap> slike;
    private final ArrayList<String> nazivi;
    private final ArrayList<String> grad_freq;
    private final ArrayList<Boolean> omiljeni;

    MyAdapter (Context c, ArrayList<Bitmap> slike, ArrayList<String> nazivi, ArrayList<String> grad_freq, ArrayList<Boolean> omiljeni) {
        super(c, R.layout.row, R.id.textView1, nazivi);
        this.context = c;
        this.slike = slike;
        this.nazivi = nazivi;
        this.grad_freq= grad_freq;
        this.omiljeni = omiljeni;
    }
// ...
}

当然,删除想要的项目后,一定要调用:

adapter.notifyDataSetChanged();

感谢这里的答案。

于 2021-06-06T16:36:05.223 回答
0

你可以这样尝试:

new ArrayList<>(Arrays.asList(recentlyClient))

示例代码如何实现:

String[] recentlyClient;

ArrayAdapter<String> recenAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<>(Arrays.asList(recentlyClient)));

于 2020-11-19T00:15:02.067 回答