Android 適配器(Adapter)、觀察者(Observer) 模式,androidobserver

來源:互聯網
上載者:User

Android 適配器(Adapter)、觀察者(Observer) 模式,androidobserver

適配器(Adapter)詳述:http://blog.csdn.net/jjwwmlp456/article/details/39893723

觀察者(Observer)詳述:http://blog.csdn.net/jjwwmlp456/article/details/39967021


AdapterView 體系


  AdapterView中會使用Adapter


Adapter 體系


  BaseAdapter 實現了 SpinnerAdapter、ListAdapter

        這樣的形式,就是 適配器模式的應用, 這裡是採用的是  介面適配器


觀察者(Observer) 模式

在Adapter中定義了註冊和反註冊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  觀察者(觀察資料集:發生變化onChanged、無效onInvalidated)

Observable 處理觀察者(添加、移除、註冊、反註冊)

DataSetObservable extends Observable<DataSetObserver>   添加了通知數據改變和無效的 兩個方法


在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(),重新設定layout  

整個觀察資料變化導致介面改變的流程:
1.  在AdapterView體系中 自訂 AdapterDataSetObserver,並註冊(即添加observer到observable)。

2.  在調用adapter.notifyDataSetChanged()後,內部執行observable的notifyChanged(),

       將執行每一個observer的onChanged(),也就達到了更新介面的效果。

    notifyDataSetInvalidated同理



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.