Android 의 디자인 모드 - DataSetObservable 관찰자 모드

5467 단어 android
ListView 클래스, Adapter 를 설정 할 때 관찰자 등록:
public void setAdapter(ListAdapter adapter) {
    。。。
    //AdapterDataSetObserver ListView   AdapterView    
    mDataSetObserver = new AdapterDataSetObserver();
    mAdapter.registerDataSetObserver(mDataSetObserver);  //       
    。。。
    requestLayout();//    
} 

ListAdapter 는 인터페이스 로 BaseAdapter 가 계승 했다.notifyDataSetChanged 방법 은 어댑터 의 내용 이 바 뀌 었 을 때 getView 를 강제로 호출 하여 각 항목 의 내용 을 새로 고 쳐 야 할 경우 컨트롤 을 다시 그립 니 다 (초기 상태 로 복원).notifyDataSetInvalidated 는 데이터 세트 모니터링 이 바 뀌 는 상황 을 발견 할 때마다 이 데이터 세트 가 더 이상 유효 하지 않 으 면 이 방법 을 사용 하여 현재 보 이 는 영역 을 다시 그립 니 다.
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);
    }

    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
    /**
     * Notifies the attached observers that the underlying data is no longer valid
     * or available. Once invoked this adapter is no longer valid and should
     * not report further data set changes.
     */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
}

DataSetObservable 정 의 는 다음 과 같 습 니 다.
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();
            }
        }
    }
}

여기 mObserver. get (i) 은 사실상 우리 ListView 의 AdapterDataSetObserver 입 니 다. AdapterDataSetObserver (AbListView 에서) 를 살 펴 보 겠 습 니 다.
class AdapterDataSetObserver extends AdapterView<ListAdapter>.AdapterDataSetObserver {

        public void onChanged() {
            super.onChanged();
            if (mFastScroller != null) {
                mFastScroller.onSectionsChanged();
            }
        }
        public void onInvalidated() {
            super.onInvalidated();
            if (mFastScroller != null) {
                mFastScroller.onSectionsChanged();
            }
        }
}

android \ widget \ FastScroller. java 코드 보기
public void onSectionsChanged() {
        mListAdapter = null;
}

좋은 웹페이지 즐겨찾기