[Android]ArrayAdapterの”UnSupportedOperationException”を回避する方法

投稿者:

ListViewのアダプタにはArrayAdapterを継承するクラスを使うことが多い。
ArrayAdapterにはデータを空にするclear()メソッドがあるが、これを実行すると”UnsupportedOperationException”という例外が発生することがある。
大雑把に翻訳すると「サポートされてない操作だからダメ!」という意味だが、堂々と実装されているclear()メソッドを呼ぶことがダメなのかよ!と困惑してしまう。

原因を探るためにネットで検索すると下のサイトにたどり着いた。

ArrayAdapter使ったらなぜかUnSupportedOperationExceptionで落ちる

要するにclear()メソッドがダメなのではなく、ArrayAdapter内部でデータの追加や削除ができないオブジェクトが使われているため、そこでエラーが発生しているらしい。なんやねんそれ?

ただし、引数が二つだけのコンストラクタを使った場合のみ追加と削除ができるようだ。

そのコンストラクタは

ArrayAdapter(Context context, int resource);

という感じで、データは指定せずに、ContextとレイアウトのリソースIDのみ渡している。
データはというと後からadd()やaddAll()で追加する。

つまり、データの追加削除を想定したListViewを作るときはアダプタを

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, strDatas);

と作成するのではなく

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem);
adapter.addAll(strDatas);

とするのが正解のようだ。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください