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);
とするのが正解のようだ。