ListView'de ArrayAdapter değiştirilemiyor: UnsupportedOperationException


95

İsimler içeren bir liste yapmaya çalışıyorum. Bu liste değiştirilebilir olmalıdır (ekleme, silme, sıralama vb.). Ancak, ArrayAdapter'daki öğeleri her değiştirmeye çalıştığımda, program java.lang.UnsupportedOperationExceptionhata vererek çöktü . İşte kodum:

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

Yöntemleri eklemeyi, kaldırmayı ve temizlemeyi denedim ve hiçbiri işe yaramadı. Biri bana neyi yanlış yaptığımı söyleyebilir mi?

Yanıtlar:


285

Denedim, kendim ... İşe yaramadığını buldum. Bu yüzden ArrayAdapter kaynak kodunu kontrol ettim ve sorunu buldum. ArrayAdapter, bir dizi tarafından başlatıldığında, diziyi değiştirilemeyen bir ÖzetListe (Liste) dönüştürür.

ÇözümArrayList<String> ArrayAdapter'ı başlatırken bunun yerine bir dizi kullanın .

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

Şerefe!


8
Çok teşekkür ederim! Beni saatler süren hayal kırıklığından kurtardın. String [] 'in neden işe yaramadığını bana açıklar mısınız?
Ryan

@Ryan bir diziye ekleyemezsiniz, liste uygulaması buna izin vermediği sürece bir listeye girebilirsiniz. Yedekleme verileriniz değişmeyecekse, ArrayAdapter belleği daha verimli kullanan bir teknik kullanmanızı sağlar.
Stephen Denne

@ st0le "new ArrayList <String> (Arrays.asList (array))" veya sadece "Arrays.asList (array)" i geçersem ne fark eder? İlki çalışır, ikincisi çalışmaz.
golosovsky

1
@golosovsky, Birincisinde Değişken Liste oluşturursunuz, ikinci yol ise Değişmez Liste oluşturur. (oluşturulduktan sonra değiştirilemez)
st0le

3
Yıl 2016 ve hala bu özel senaryoda atılan bu saçma istisna.
Eido95
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.