アダプターの詳細: //m.sbmmt.com/java-article-355851.html
オブザーバーの詳細: //m.sbmmt.com/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 Observable
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 サイトの他の関連記事を参照してください。