ホームページ  >  記事  >  Java  >  Android アダプター (Adapter) とオブザーバー (Observer) パターンのコード分析 (写真)

Android アダプター (Adapter) とオブザーバー (Observer) パターンのコード分析 (写真)

黄舟
黄舟オリジナル
2017-03-11 11:51:022971ブラウズ

アダプターの詳細: http://www.php.cn/java-article-355851.html

オブザーバーの詳細: http://www.php.cn/java-article-356024 .html

AdapterView システム


AdapterView は、Adapter

Adapter system


BaseAdapter は SpinnerAdapter、ListAdapter を実装します

このフォームは、アダプター パターンのアプリケーションです。ここにインターフェイス アダプターがあります

オブザーバーモードが使用されます

DataSetObserver の登録と登録解除のメソッドはアダプターで定義されています

public interface Adapter {
  
    void registerDataSetObserver(DataSetObserver observer);

    void unregisterDataSetObserver(DataSetObserver observer);

    ...
}
public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }

    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
    ...
}
public class DataSetObservable extends Observable<DataSetObserver> {

    public void notifyChanged() {
        synchronized(mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }

    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}
public abstract class Observable<T> {

    protected final ArrayList<T> mObservers = new ArrayList<T>();

    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            mObservers.add(observer);
        }
    }

    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            mObservers.remove(index);
        }
    }

    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }
    }
}

DataSetObserver オブザーバー (観察データセット: onChanged で変更され、onInvalidated で無効)

Observable はオブザーバーを処理します (追加、削除、登録解除、スター)

DataSetObservable extends Observable4864d1769940fac3918b0cc0f2557122 データの変更と無効を通知するメソッドを2つ追加しました

AdapterView

class AdapterDataSetObserver extends DataSetObserver {

        private Parcelable mInstanceState = null;

        @Override
        public void onChanged() {
            mDataChanged = true;
            mOldItemCount = mItemCount;
            mItemCount = getAdapter().getCount();

            // Detect the case where a cursor that was previously invalidated has
            // been repopulated with new data.
            if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
                    && mOldItemCount == 0 && mItemCount > 0) {
                AdapterView.this.onRestoreInstanceState(mInstanceState);
                mInstanceState = null;
            } else {
                rememberSyncState();
            }
            checkFocus();
            requestLayout();
        }

        @Override
        public void onInvalidated() {
            mDataChanged = true;

            if (AdapterView.this.getAdapter().hasStableIds()) {
                // Remember the current state for the case where our hosting activity is being
                // stopped and later restarted
                mInstanceState = AdapterView.this.onSaveInstanceState();
            }

            // Data is invalid so we should reset our state
            mOldItemCount = mItemCount;
            mItemCount = 0;
            mSelectedPosition = INVALID_POSITION;
            mSelectedRowId = INVALID_ROW_ID;
            mNextSelectedPosition = INVALID_POSITION;
            mNextSelectedRowId = INVALID_ROW_ID;
            mNeedSync = false;

            checkFocus();
            requestLayout();
        }

        public void clearSavedState() {
            mInstanceState = null;
        }
    }

AdapterDataSetObserverが定義されているため、両方の実装メソッドでrequestLayout()が呼び出され、レイアウトがリセットされます

インターフェイスの変更につながるデータ変更を監視するプロセス全体:
1. AdaptorView システムで AdaptorDataSetObserver をカスタマイズし、登録します (つまり、observable にオブザーバーを追加します)。

2.adapter.notifyDataSetChanged()を呼び出した後、オブザーバブルのnotifyChanged()が内部で実行され、

が各オブザーバーのonChanged()を実行することで、インターフェースを更新する効果が得られます。

同じことがnotifyDataSetInvalidatedにも当てはまります

以上がAndroid アダプター (Adapter) とオブザーバー (Observer) パターンのコード分析 (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。