Maison >Java >javaDidacticiel >Analyse du code des modèles Android Adapter (Adapter) et Observer (Observer) (image)
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!