ListViewでArrayAdapterを変更できません:UnsupportedOperationException


94

名前を含むリストを作成しようとしています。このリストは変更可能でなければなりません(追加、削除、ソートなど)。しかし、ArrayAdapterのアイテムを変更しようとすると、プログラムがjava.lang.UnsupportedOperationExceptionエラーでクラッシュしました。これが私のコードです:

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

挿入、削除、クリアの方法を試しましたが、どれも機能しませんでした。誰かが私が間違ったことを教えてもらえますか?

回答:


282

私も試してみましたが、うまくいきませんでした。だから私はArrayAdapterのソースコードをチェックして、問題を見つけました。ArrayAdapterは、配列によって初期化されると、配列を変更できないAbstractList(リスト)に変換します。

解決策ArrayList<String> 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); 

乾杯!


8
どうもありがとうございます!欲求不満の時間を節約してくれました。String []が機能しない理由を教えていただけませんか。
ライアン

@Ryan配列に挿入することはできません。リストの実装で許可されていない限り、リストに挿入できます。バッキングデータが変更されない場合、ArrayAdapterを使用すると、よりメモリ効率の高い手法を使用できます。
Stephen Denne、2010

@ st0le「new ArrayList <String>(Arrays.asList(array))」または単に「Arrays.asList(array)」を渡した場合、どのような違いがありますか?1つ目は機能し、2つ目は機能しません。
golosovsky

1
@ golosovsky、1つ目は可変リストを作成し、2つ目は不変リストを作成します。(一度作成すると変更できません)
st0le

3
それは2016年であり、この特定のシナリオでスローされたこのとんでもない例外です。
Eido95 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.