PagerAdapter中的NotifyDataSetChanged

来源:互联网 发布:手机淘宝店怎么申请 编辑:程序博客网 时间:2024/06/06 08:32

我们知道ViewPager设置PagerAdapter之后通过notifyDataSetChanged方法也可以更新ViewPager,那么这是怎么实现的呢?答案是观察者模式。下面我们顺藤摸瓜看看,这个观察者模式是怎么实现的。

1. 首先是PagerAdapter的notifyDataSetChanged方法:

public void notifyDataSetChanged() {    synchronized (this) {        if (mViewPagerObserver != null) {            mViewPagerObserver.onChanged();        }    }    mObservable.notifyChanged();    }

顾名思义,notifyDataSetChanged即通知数据集合发生了变化,方法中一个是通知mViewPagerObserver执行onChanged,一个是执行成员变量被观察者mObservable的notifyChanged方法。

1.1 我们先看一看mObservable用在哪些地方。

private final DataSetObservable mObservable = new DataSetObservable();...// 注册观察者public void registerDataSetObserver(DataSetObserver observer) {        mObservable.registerObserver(observer);}...// 注销观察者public void unregisterDataSetObserver(DataSetObserver observer) {        mObservable.unregisterObserver(observer);}

而在ViewPager中我们并没有看到注册观察者和注销观察者的方法的调用,因此这个observable是一个备用的被观察者,用户可以根据需要给PagerAdapter新增观察者。

1.2 我们再看一下mViewPagerObserver的调用情况:

有一个设置观察者的方法:

void setViewPagerObserver(DataSetObserver observer) {    synchronized (this) {        mViewPagerObserver = observer;    }}

在ViewPager的setAdapter中调用了此方法:

public void setAdapter(PagerAdapter adapter) {    if (mAdapter != null) {        mAdapter.setViewPagerObserver(null);        ...    }    ...    mAdapter = adapter;    ...    if (mAdapter != null) {        if (mObserver == null) {            mObserver = new PagerObserver();        }        mAdapter.setViewPagerObserver(mObserver);        ...    }    ...}

从上面的代码中可以看出,mViewPagerObserver 是PagerAdapter中默认使用的观察者,通过setViewPagerObserver(DataSetObserver)实现了注册和注销观察者的功能。

2. 顺着setViewPagerObserver我们找到了PagerObserver——DataSetObserver的观察者具体实现:

private class PagerObserver extends DataSetObserver {    PagerObserver() {    }    @Override    public void onChanged() {        dataSetChanged();    }    @Override    public void onInvalidated() {        dataSetChanged();    }}

原来在PagerAdapter通知mViewPagerObserver执行onChanged方法时,ViewPager调用了dataSetChanged方法:这里面代码很长,我就不贴了,从中可以看出执行这段代码发生了页面更新。

到此,PagerAdapter的观察者模式的简单分析就结束了。总结一下:本质上,ViewPager是一个观察者,PagerAdapter是一个被观察者,当数据集发生变化时,PagerAdapter会通知ViewPager更新界面。ViewPager在setAdapter时将自己的成员变量观察者PagerObserver,通过setViewPagerObserver方法注册到了PagerAdapter中,在PagerAdapter调用notifyDataSetChanged方法时即触发了观察者PagerObserver的onChanged方法,实现了ViewPager的更新。

0 0
原创粉丝点击