Heim > Java > javaLernprogramm > Codeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild)

Codeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild)

黄舟
Freigeben: 2017-03-11 11:51:02
Original
3049 Leute haben es durchsucht

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);

    ...
}
Nach dem Login kopieren
public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}
Nach dem Login kopieren
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();
    }
    ...
}
Nach dem Login kopieren
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();
            }
        }
    }
}
Nach dem Login kopieren
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();
        }
    }
}
Nach dem Login kopieren

DataSetObserver Observer (Beobachtungsdatensatz: geändert bei Changed, ungültig bei Invalidated)

Observable verwaltet den Beobachter (Hinzufügen, Entfernen, Registrieren, Abmelden)

DataSetObservable erweitert Observable Zwei Methoden zur Benachrichtigung von Datenänderungen und Ungültigkeit hinzugefügt

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;
        }
    }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage