ListViewやGalleryなどのウィジェットは、リストをデータセットとして保持する。データセットの操作は、リストそのもの、或いは、Adapterを経由して行われる。
最も一般的なのは、Adapterを経由して操作することである。 add(), insert(), remove()などの一般的な操作は揃っている。
操作は、即座にViewに反映されるが、故に、UIスレッド以外から行うと例外が起こる。
UIスレッド以外から呼び出す場合はHandler経由になるが、順序保証もないため、連続してデータをadd()する場合などに問題があるかも知れない。
そのような場合には、Listを直接操作することになる。
Listそのものを操作することで、データセットを変更することは可能である。 しかし、変更が即座に Viewに反映されることはない。
逆に言えば、UIスレッド以外から操作を行う場合、或いは、大量のデータを追加や削除する場合に向いている。 Handlerを経由するわけでもないので、データセットの操作順序は保証される。
ただし、UIスレッド側で、何らかの操作-リストをスクロールするなど-が入ると、一貫性が破綻し、IllegalStateExceptionを発生することがある。UI側からの操作を禁止するにはsetVisibility(View.GONE)するなどする必要があろう。(freeze/thawのような操作はAndroidにはないようである。)
データセットの操作をView に反映させるには、notifyDatasetChanged()を呼び出す必要がある。
adapter.notifyDatasetChanged();
この操作は、UIスレッドで行われる必要がある。 従って、
handler.post(new Runnable(){ public void run() { adapter.notifyDatasetChanged(); } });
のように、必要に応じて、Handlerを経由する。
Androidに関してへ戻る。