Android中的设计模式——DataSetObservable 观察者模式

本文探讨了Android中设计模式的应用,重点关注DataSetObservable和观察者模式。在ListView的Adapter设置过程中,通过注册观察者来实现在数据变化时自动刷新Item内容的功能。notifyDataSetChanged和notifyDataSetInvalidated两个方法分别用于数据改变和数据无效时触发控件重绘。DataSetObservable的内部机制结合AdapterDataSetObserver协同工作,确保UI与数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListView类,当我们设置Adapter的时候,注册了观察者:

public void setAdapter(ListAdapter adapter) {
    。。。
    //AdapterDataSetObserver是ListView的基类AdapterView的内部类
    mDataSetObserver = new AdapterDataSetObserver();
    mAdapter.registerDataSetObserver(mDataSetObserver);  //注册一个观察者
    。。。
    requestLayout();//更新视图
} 

ListAdapter是一接口,BaseAdapter继承了它。notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容,会重绘控件(还原到初始状态)。
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();
            }
        }
    }
}

这里mObservers.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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值