2014年11月5日水曜日

AndroidのArrayAdapter#notifyDataSetChangedの謎

どうも。うにあです。

 ArrayAdapter#notifyDataSetChangedのソースコードを見たことありますか??

 /**
 * {@inheritDoc}
 */
@Override
 public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
    mNotifyOnChange = true;
}
{@inheritDoc}となっているのでBaseAdapterのJavaDocを見てみる。
 
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */

データ変更をオブザーバに通知してViewに反映するメソッドですよね。ご存知の通り。

でも僕の疑問はなぜ、
mNotifyOnChange = true;
があるのかということなんですよねー。
notifyDataSetChangedを呼ぶとフラグがtrueにされてしまう。そのフラグはsetNotifyOnChangeというメソッドで操作できる。

setNotifyOnChange(boolean notifyOnChange)
Control whether methods that change the list (add(T)insert(T, int)remove(T)clear()) automatically call notifyDataSetChanged().


個人的に複数のデータを仕方なくfor文で登録しようとすると

1. setNotifyOnChange(false)
2. for文内でaddやinsertを複数回行う
3. setNotifyOnChange(true)
4. notifyDataSetChanged

というイメージで実装するのかなと思っていたのに。。いや、これで正しいとは思うんですが、notifyDataSetChangedを一度呼び出してしまうとfalseになっていたものがtrueになってしまうので注意が必要だというお話でした。

なぜこのようになっているのか疑問。。。誰か教えてください。。。






0 件のコメント:

コメントを投稿