Maison  >  Article  >  Java  >  Analyse du code des modèles Android Adapter (Adapter) et Observer (Observer) (image)

Analyse du code des modèles Android Adapter (Adapter) et Observer (Observer) (image)

黄舟
黄舟original
2017-03-11 11:51:023018parcourir

Détails de l'adaptateur : http://www.php.cn/java-article-355851.html

Détails de l'observateur : http://www.php.cn/java-article-356024. html

Système AdapterView


AdapterView utilisera Adapter

Système d'adaptateur


BaseAdapter implémente SpinnerAdapter, ListAdapter

Ce formulaire est l'application du modèle d'adaptateur, qui est utilisé ici Oui Adaptateur d'interface

Mode Observateur

Les méthodes d'enregistrement et de désenregistrement de DataSetObserver sont définies dans l'adaptateur

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 (ensemble de données d'observation : modifié onChanged, invalide onInvalidated)

Observable gère l'observateur (Ajouter, supprimer, enregistrer, désinscrire)

DataSetObservable extends Observable4864d1769940fac3918b0cc0f2557122 Ajout de deux méthodes pour notifier les modifications et l'invalidité des données

Dans 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;
        }
    }

a personnalisé AdapterDataSetObserver, appelé requestLayout() dans les deux méthodes d'implémentation et réinitialiser la mise en page

L'ensemble des modifications des données d'observation a provoqué le processus de changement d'interface :
1 Personnaliser AdapterDataSetObserver dans le système AdapterView et. enregistrez-le (c'est-à-dire ajoutez un observateur à l'observable).

2. Après avoir appelé adapter.notifyDataSetChanged(), notifyChanged() de l'observable est exécuté en interne,

exécutera onChanged de chaque observateur. () obtient également l'effet de mettre à jour l'interface.

notifyDataSetInvalidated est identique à

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn