Why can't one add/remove items from an ArrayAdapter?

三世轮回 提交于 2019-11-26 17:28:30

问题


I am using an ArrayAdapter<CharSequence> to populate the items to list in a android.widget.Spinner. That works all fine.

But now I want to keep the list of items dynamic, i.e. I want to be able to add/remove items from the selection list at runtime. However, when I call adapter.add(item) or adapter.remove(item) I always get a UnsupportedOperationException, even though the Javadocs of the ArrayAdapter class describe these two methods as to be usable for exactly that intended purpose.

Is this a bug, really not implemented or what am I missing here?


回答1:


You probably initialized the adapter with a plain Java array (e.g., String[]). Try using something that implements the java.util.List interface (e.g., ArrayList<String>).




回答2:


I know it's late but just a quick explanation: it's because method Arrays.asList(T... array) returns custom inner class named ArrayList that is read-only. As already said, you need to provide full impl. e.g. java.util.ArrayList.




回答3:


Here's the source code of ArrayAdapter#remove:

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

The only thing that can throw an UnsupportedOperationException there is the line in the else-block. So the problem is that the list you're using doesn't support removing items. My guess is you're using an array. Try an ArrayList, for instance.

edit: So yeah, what Mark said...




回答4:


I was having the same problem, my data was saved in resource String Array, so I was creating ArraAdapter with createFromResource.
The following code for creating ArrayAdapter from resource String Array solved the problem:

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



回答5:


In your adapter Class - Delete an Item

remove(position);
notifyDataSetChanged();

Add an Item -

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



回答6:


Probably, you are using List in your ArrayAdapter class instead of ArrayList.

Try converting your array or list to ArrayList -

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


来源:https://stackoverflow.com/questions/3476723/why-cant-one-add-remove-items-from-an-arrayadapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!