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的更新。
- PagerAdapter中的NotifyDataSetChanged
- ViewPager的PagerAdapter中的notifyDataSetChanged更新数据总结
- PagerAdapter notifyDataSetChanged失效
- Android PagerAdapter notifyDatasetChanged
- ViewPager的PagerAdapter.notifyDataSetChanged()
- PagerAdapter.notifyDataSetChanged() 无效解决办法
- PagerAdapter notifyDataSetChanged没有效果解决方法
- ViewPager 放PagerAdapter 的notifyDataSetChanged()
- PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged
- android PagerAdapter notifyDataSetChanged() 无法更新数据问题解决
- PagerAdapter的notifyDataSetChanged()不起作用的问题
- pageradapter中调用notifyDataSetChanged()无效果
- 解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题
- viewpager适配器pageradapter调用notifyDataSetChanged()数据没更新
- ViewPager报java.lang.IllegalStateException,without calling PagerAdapter#notifyDataSetChanged!
- PagerAdapter使用notifyDataSetChanged 但是视图并为改变的原因。
- PagerAdapter
- PagerAdapter
- MySQL操作
- 克隆二叉树ke
- javascript callback函数的理解与使用
- Pass in an array of Deferreds to $.when()
- 平衡二叉搜索树——AVL树
- PagerAdapter中的NotifyDataSetChanged
- 关于微信APP支付,提示支付验证签名失败
- autoresizing布局
- 二叉树常用操作算法集、解释及注意事项
- linux删除大量文件
- [LeetCode]342. Power of Four
- MATLAB读json文件
- 致青春
- 安卓组件化架构实践