Impossible de modifier ArrayAdapter dans ListView: UnsupportedOperationException

94

J'essaye de faire une liste contenant des noms. Cette liste doit être modifiable (ajouter, supprimer, trier, etc.). Cependant, chaque fois que j'essayais de modifier les éléments dans ArrayAdapter, le programme se plantait, avec une java.lang.UnsupportedOperationExceptionerreur. Voici mon code:

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

J'ai essayé des méthodes d'insertion, de suppression et d'effacement, et aucune d'elles n'a fonctionné. Est-ce que quelqu'un me dirait ce que j'ai fait de mal?

Ryan
la source

Réponses:

282

Je l'ai essayé moi-même ... J'ai trouvé que ça ne fonctionnait pas. Je vérifie donc le code source d' ArrayAdapter et découvre le problème. Le ArrayAdapter, une fois initialisé par un tableau, convertit le tableau en une AbstractList (List) qui ne peut pas être modifiée.

Solution Utilisez ArrayList<String>plutôt un en utilisant un tableau lors de l'initialisation de l'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); 

À votre santé!

st0le
la source
8
Merci beaucoup! Vous m'avez sauvé des heures de frustration. Pourriez-vous m'expliquer pourquoi String [] n'a pas fonctionné?
Ryan
@Ryan vous ne pouvez pas insérer dans un tableau, vous pouvez dans une liste, sauf si l'implémentation de la liste ne le permet pas. Si vos données de sauvegarde ne vont pas changer, ArrayAdapter vous permet d'utiliser une technique plus efficace en mémoire.
Stephen Denne
@ st0le quelle différence cela fait-il si je passe "new ArrayList <String> (Arrays.asList (array))" ou simplement "Arrays.asList (array)"? Le premier fonctionne et le second non.
golosovsky
1
@golosovsky, Dans le premier, vous créez une liste mutable, la deuxième façon crée une liste immuable. (ne peut pas être modifié une fois créé)
st0le
3
Nous sommes en 2016 et toujours cette exception ridicule lancée à ce scénario spécifique.
Eido95 du