>  기사  >  Java  >  안드로이드 어댑터(Adapter)와 옵저버(Observer) 패턴의 코드 분석(그림)

안드로이드 어댑터(Adapter)와 옵저버(Observer) 패턴의 코드 분석(그림)

黄舟
黄舟원래의
2017-03-11 11:51:023020검색

어댑터 세부정보: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.