相信用过viewpager的同学都会遇到调用notifydataSetChanged()后不刷新或者不符合预期的问题,今天就来分析分析这里的来龙去脉。这一切还得从viewpager的setAdapter说起:
/**
* Set a PagerAdapter that will supply views for this pager as needed.
*
* @param adapter Adapter to use
*/
public void setAdapter(PagerAdapter adapter) {
...(省略若干行,下同)
...
final PagerAdapter oldAdapter = mAdapter;
mAdapter = adapter;
mExpectedAdapterCount = 0;
if (mAdapter != null) {
if (mObserver == null) {
mObserver = new PagerObserver();
}
mAdapter.registerDataSetObserver(mObserver);
...
...
}
...
}
mAdapter.registerDataSetObserver(mObserver)这里用到了观察者模式,mObserver是PagerObserver的一个实例,而PagerObserver是ViewPager的一个内部类,其声明如下:
private class PagerObserver extends DataSetObserver {
@Override
public void onChanged() {
//这里调用了viewpager的dataSetChanged()方法,下同
dataSetChanged();
}
@Override
public void onInvalidated() {
dataSetChanged();
}
}

本文探讨了在使用ViewPager时遇到notifyDataSetChanged()刷新问题的原因,从源码层面分析了从setAdapter开始的数据变更流程。当PagerAdapter的mAdapter数据变化时,会触发PagerObserver的onChanged方法,进而调用dataSetChanged()。如果mAdapter.getItemPosition()返回POSITION_UNCHANGED,则不会刷新视图;否则,将调用setCurrentItemInternal(),可能导致视图更新。复写instantiateItem()对于PagerAdapter正确刷新至关重要,决定是否重新创建或附加Fragment。
最低0.47元/天 解锁文章
1444

被折叠的 条评论
为什么被折叠?



