Tidak dapat mengubah ArrayAdapter di ListView: UnsupportedOperationException


95

Saya mencoba membuat daftar yang berisi nama. Daftar ini harus dapat dimodifikasi (tambah, hapus, urutkan, dll). Namun, setiap kali saya mencoba mengubah item di ArrayAdapter, program macet, dengan java.lang.UnsupportedOperationExceptionkesalahan. Ini kode saya:

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

Saya mencoba menyisipkan, menghapus, dan menghapus metode, dan tidak ada yang berhasil. Akankah seseorang memberi tahu saya apa yang saya lakukan salah?

Jawaban:


283

Saya mencobanya, sendiri ... Ternyata tidak berhasil. Jadi saya memeriksa kode sumber ArrayAdapter dan menemukan masalahnya. ArrayAdapter, saat diinisialisasi oleh larik, mengubah larik tersebut menjadi AbstractList (List) yang tidak dapat diubah.

Solusi Gunakan ArrayList<String>alih - alih menggunakan array saat menginisialisasi 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); 

Bersulang!


8
Terima kasih banyak! Anda menyelamatkan saya dari frustrasi berjam-jam. Maukah Anda menjelaskan kepada saya mengapa String [] tidak berfungsi?
Ryan

@Ryan Anda tidak dapat memasukkan ke dalam array, Anda bisa ke dalam daftar, kecuali implementasi daftar tidak mengizinkannya. Jika data pendukung Anda tidak akan berubah, ArrayAdapter memungkinkan Anda untuk menggunakan teknik yang lebih efisien memori.
Stephen Denne

@ st0le apa bedanya jika saya meneruskan "new ArrayList <String> (Arrays.asList (array))" atau hanya "Arrays.asList (array)"? Yang pertama berhasil dan yang kedua tidak.
golosovsky

1
@golosovsky, Yang pertama, Anda membuat Daftar yang Dapat Diubah, cara kedua membuat Daftar yang Tidak Dapat Diubah. (tidak dapat diubah setelah dibuat)
st0le

3
Ini 2016 dan masih ada pengecualian konyol yang dilemparkan pada skenario khusus ini.
Eido95
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.