Details zum Adapter: //m.sbmmt.com/java-article-355851.html
Details zum Observer: //m.sbmmt.com /java-article-356024. html
AdapterView-System
AdapterView verwendet Adapter
Adaptersystem
BaseAdapter implementiert SpinnerAdapter, ListAdapter
Dieses Formular ist die Anwendung des Adaptermusters, das hier verwendet wird Ja Schnittstellenadapter
Observer-Modus
Methoden zum Registrieren und Aufheben der Registrierung von DataSetObserver sind im Adapter definiert
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 Observer (Beobachtungsdatensatz: geändert bei Changed, ungültig bei Invalidated)
Observable verwaltet den Beobachter (Hinzufügen, Entfernen, Registrieren, Abmelden)
DataSetObservable erweitert Observable
In AdapterView passt
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; } }
den AdapterDataSetObserver an und ruft requestLayout() auf. in beiden Implementierungsmethoden und setzt das Layout zurück
Die gesamten Beobachtungsdaten ändern sich, was zum Schnittstellenänderungsprozess führt:
1. Passen Sie AdapterDataSetObserver im AdapterView-System an und registrieren Sie es (d. h. fügen Sie Beobachter zu Observable hinzu).
2. Nach dem Aufruf von adapter.notifyDataSetChanged() wird notifyChanged() des Observables intern ausgeführt,
führt onChanged jedes Beobachters aus () erzielt auch den Effekt einer Aktualisierung der Schnittstelle.
notifyDataSetInvalidated ist dasselbe wie
Das obige ist der detaillierte Inhalt vonCodeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!