어댑터 세부정보: http://www.php.cn/java-article-355851.html
관찰자 세부정보: http://www.php.cn /java-article-356024.html
AdapterView 시스템
AdapterView는 Adapter를 사용합니다
Adapter 시스템
BaseAdapter는 SpinnerAdapter, ListAdapter를 구현합니다
이 양식은 여기서 사용되는 어댑터 패턴을 적용한 것입니다. 예 인터페이스 어댑터
관찰자 모드
DataSetObserver 등록 및 등록 취소 방법은 어댑터
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(데이터 세트 관찰: Changed onChanged, 유효하지 않음)에 정의되어 있습니다. onInvalidated)
Observable은 관찰자를 처리합니다(추가, 제거, 등록, 등록 취소)
DataSetObservable은 Observable4864d1769940fac3918b0cc0f2557122 변경 및 무효화
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; } }
사용자 정의된 AdapterDataSetObserver에서 requestLayout()이 두 구현 방법 모두에서 호출되고 레이아웃이 재설정됩니다.
인터페이스 변경으로 이어지는 데이터 변경을 관찰하는 전체 프로세스:
1. AdapterView 시스템의 AdapterDataSetObserver를 사용자 정의하고 등록합니다(즉, 관찰 가능 개체에 관찰자를 추가합니다).
2. Adapter.notifyDataSetChanged()를 호출한 후 Observable의 informChanged()가 내부적으로 실행되고,
이 각 관찰자의 onChanged를 실행합니다. ()는 또한 인터페이스를 업데이트하는 효과를 얻습니다.
informDataSetInvalidated는
과 동일합니다.위 내용은 안드로이드 어댑터(Adapter)와 옵저버(Observer) 패턴의 코드 분석(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!