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?

Ryan
sumber

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!

st0le
sumber
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