直入主题:
第一:FragmentPagerAdapter.notifyDataSetChanged无法刷新
首先,我们发现,FragmentPagerAdapter并没有notifyDataSetChanged方法,是其父类PagerAdapter的方法。
找到PagerAdapter源码
/**
* This method should be called by the application if the data backing this adapter has changed
* and associated views should update.
*/
public void notifyDataSetChanged() {
synchronized (this) {
if (mViewPagerObserver != null) {
mViewPagerObserver.onChanged();
}
}
mObservable.notifyChanged();
}
下面的mObservable.notifyChanged()不是我们要追踪的目标,他是用来发起其他的数据更新。我们的目标是mViewPagerObserver.onChanged();
找到mViewPagerObserver被赋值的地方,void setViewPagerObserver(DataSetObserver observer),按ctrl+alt+f7两次,在库文件中查找到在ViewPager中对它进行了赋值
...
if (mAdapter != null) {
if (mObserver == null) {
mObserver = new PagerObserver();
}
mAdapter.setViewPagerObserver(mObserver);
....
赋值进去的是PagerObserver,子类赋值给了父容器。
找到重写的PagerObserver类,重写了父类两个方法
private class PagerObserver extends DataSetObserver {
PagerObserver() {
}
@Override
public void onChanged() {
dataSetChanged();
}
@Override
public void onInvalidated() {
dataSetChanged();
}
}
到这里可以发现,最开始我们找的目标mViewPagerObserver.onChanged()调用的其实是PagerObserver里面的onChanged(),即调用了dataSetChanged();
此时心里一堆mmp。
好吧,我们看看dataSetChanged()
void dataSetChanged() {
...
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
final int newPos = mAdapter.getItemPosition(ii.object);
if (newPos &#