¿Por qué no se pueden agregar / eliminar elementos de un ArrayAdapter?

Estoy usando un ArrayAdapter para completar los elementos a la lista en un android.widget.Spinner . Eso funciona todo bien.

Pero ahora quiero mantener la lista de elementos dynamics, es decir, quiero poder agregar / eliminar elementos de la lista de selección en tiempo de ejecución. Sin embargo, cuando llamo adapter.add(item) o adapter.remove(item) siempre obtengo una UnsupportedOperationException , aunque los Javadocs de la clase ArrayAdapter describen estos dos métodos para que se puedan usar exactamente para ese propósito.

¿Es esto un error, realmente no implementado o qué me falta aquí?

Probablemente haya inicializado el adaptador con una matriz Java simple (por ejemplo, String[] ). Intente usar algo que implemente la interfaz java.util.List (por ejemplo, ArrayList ).

Sé que es tarde, pero solo una explicación rápida: es porque el método Arrays.asList (T … array) devuelve una clase interna personalizada llamada ArrayList que es de solo lectura . Como ya se dijo, debes proporcionar full impl. por ejemplo java.util.ArrayList.

Aquí está el código fuente de ArrayAdapter#remove :

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

Lo único que puede arrojar una UnsupportedOperationException allí es la línea en else-block. Entonces, el problema es que la lista que está utilizando no es compatible con la eliminación de elementos. Supongo que estás usando una matriz. Pruebe una ArrayList, por ejemplo.

editar: Así que sí, lo que dijo Mark …

Estaba teniendo el mismo problema, mis datos se guardaron en la matriz de cadenas de recursos, así que estaba creando ArraAdapter con createFromResource .
El siguiente código para crear ArrayAdapter de la matriz de cadenas de recursos resolvió el problema:

 Resources res = getResources(); String[] cities = res.getStringArray(R.array.cities_array); ArrayAdapter adapter = new ArrayAdapter( this, android.R.layout.simple_spinner_item, new ArrayList(Arrays.asList(cities))); 

En tu clase de adaptador: elimina un elemento

 remove(position); notifyDataSetChanged(); 

Agregar un artículo –

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

Probablemente, está utilizando List en su clase ArrayAdapter en lugar de ArrayList .

Intente convertir su matriz o lista a ArrayList

 new ArrayList(Arrays.asList(array));