Não é possível modificar ArrayAdapter em ListView: UnsupportedOperationException

94

Estou tentando fazer uma lista contendo nomes. Esta lista deve ser modificável (adicionar, excluir, classificar, etc). Porém, sempre que tentava alterar os itens do ArrayAdapter, o programa travava, com java.lang.UnsupportedOperationExceptionerro. Aqui está o meu 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);
   }
});

Tentei inserir, remover e limpar métodos e nenhum deles funcionou. Alguém me diria o que fiz de errado?

Ryan
fonte

Respostas:

282

Eu tentei sozinho ... Descobri que não funcionou. Então, verifiquei o código-fonte do ArrayAdapter e descobri o problema. O ArrayAdapter, ao ser inicializado por um array, converte o array em uma AbstractList (List) que não pode ser modificada.

Solução Use um em ArrayList<String>vez de usar uma matriz ao inicializar o 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); 

Felicidades!

St0le
fonte
8
Muito obrigado! Você me salvou horas de frustração. Você se importaria de me explicar por que String [] não funcionou?
Ryan
@Ryan você não pode inserir em um array, você pode em uma lista, a menos que a implementação da lista não permita. Se seus dados de apoio não forem alterados, ArrayAdapter permite que você use uma técnica mais eficiente de memória.
Stephen Denne
@ st0le que diferença faz se eu passar "new ArrayList <String> (Arrays.asList (array))" ou apenas "Arrays.asList (array)"? O primeiro funciona e o segundo não.
golosovsky
1
@golosovsky, No primeiro, você cria uma Lista Mutável, a segunda forma cria uma Lista Imutável. (não pode ser modificado depois de criado)
início de
3
É 2016 e ainda esta exceção ridícula lançada neste cenário específico.
Eido95 de