No se puede modificar ArrayAdapter en ListView: UnsupportedOperationException

94

Estoy intentando hacer una lista que contenga nombres. Esta lista debe ser modificable (agregar, eliminar, ordenar, etc.). Sin embargo, cada vez que intentaba cambiar los elementos en ArrayAdapter, el programa fallaba con un java.lang.UnsupportedOperationExceptionerror. Aquí está mi código:

ListView panel = (ListView) findViewById(R.id.panel);
String[] array = {"a","b","c","d","e","f","g"};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, array);
adapter.setNotifyOnChange(true);
panel.setAdapter(adapter);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
      adapter.insert("h", 7);
   }
});

Intenté insertar, eliminar y borrar métodos, y ninguno funcionó. ¿Alguien me diría qué hice mal?

Ryan
fuente

Respuestas:

282

Lo probé yo mismo ... Descubrí que no funcionaba. Así que revisé el código fuente de ArrayAdapter y descubrí el problema. El ArrayAdapter, al ser inicializado por una matriz, convierte la matriz en una AbstractList (Lista) que no se puede modificar.

Solución Use an ArrayList<String>en su lugar usando una matriz mientras inicializa ArrayAdapter.

String[] array = {"a","b","c","d","e","f","g"}; 
ArrayList<String> lst = new ArrayList<String>(Arrays.asList(array));
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, lst); 

¡Salud!

st0le
fuente
8
Muchas gracias! Me ahorraste horas de frustración. ¿Le importaría explicarme por qué String [] no funcionó?
Ryan
@Ryan no puede insertarlo en una matriz, puede hacerlo en una lista, a menos que la implementación de la lista no lo permita. Si sus datos de respaldo no van a cambiar, ArrayAdapter le permite usar una técnica más eficiente en memoria.
Stephen Denne
@ st0le ¿qué diferencia hay si paso "new ArrayList <String> (Arrays.asList (array))" o simplemente "Arrays.asList (array)"? El primero funciona y el segundo no.
golosovsky
1
@golosovsky, En la primera, creas una Lista mutable, la segunda forma crea una Lista inmutable. (no se puede modificar una vez creado)
st0le
3
Es 2016 y todavía esta ridícula excepción lanzada a este escenario específico.
Eido95