2014年10月29日水曜日

AndroidのArrayAdapterのnotifyDataSetChangedについて

AndroidのArrayAdapterのnotifyDatasetChangedについて

notifyDatasetChangedをAdapter外で使うのはよくないよなぁ。ってかそもそもnotifyDatasetChangedとはなんぞやって所から始まった話。

notifyDataSetChanged()とは

     /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

データが変更された時にViewに対してリフレッシュを通知するメソッド。とりあえず、Viewの更新を行うと。。。

notifyDataSetChangedはadapter内で使用する!

notifyDatasetChangedはあくまでもadapterがデータ更新された時にそれを知らせるために使用するべきだと思います。とりあえず、困ったときのAndroidReferenceを見てみましょうー。

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

addやinsertやremoveやclearなどListViewに何かしらの操作があった時は自動で呼ばれるということです。例えばArrayAdapterのaddメソッドを見てみる。

    /**
     * Adds the specified object at the end of the array.
     *
     * @param object The object to add at the end of the array.
     */
    public void add(T object) {
        synchronized (mLock) {
            if (mOriginalValues != null) {
                mOriginalValues.add(object);
            } else {
                mObjects.add(object);
            }
        }
        if (mNotifyOnChange) notifyDataSetChanged();
    }

確かにnotifyDataSetChangedが呼ばれてる。

以上のことを踏まえると、Adapterクラスの操作(add,insert,remove,clearなど)の時に意識せずに呼ばれるメソッドであるべきだと思います。(本当はprotectedなメソッドにしてほしい。)
ってことで、Adapter(もしくはAdapterを継承したもの)以外でnotifyDataSetChangedを呼ぶのは良くないように思いました。

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
    mNotifyOnChange = true;
}

0 件のコメント:

コメントを投稿