Maison > Java > javaDidacticiel > 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)

黄舟
Libérer: 2017-03-11 11:51:02
original
3048 Les gens l'ont consulté

Détails de l'adaptateur : //m.sbmmt.com/java-article-355851.html

Détails de l'observateur : //m.sbmmt.com/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);

    ...
}
Copier après la connexion
public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}
Copier après la connexion
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();
    }
    ...
}
Copier après la connexion
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();
            }
        }
    }
}
Copier après la connexion
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();
        }
    }
}
Copier après la connexion

DataSetObserver Observer (ensemble de données d'observation : modifié onChanged, invalide onInvalidated)

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

DataSetObservable extends Observable 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;
        }
    }
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal