FragmentStatePagerAdapter.notifyDataSetChanged 不刷新 里面的 Fragment信息,找了半天,最后通过查询其源码解决了该问题:
先进入源码中的notifyDataSetChanged
发现这句,mObservable,看名字,观察者,应该就是用来实时监测viewPager绑定数据源的变化的,再进入notifychanged方法
发现一个遍历,这个遍历会去调用mObservers中的每一个元素的变化,我们再进入onChanged,
到了,这里,发现onChanged只是一个抽象类中的方法,,既然会调用,肯定会被重写咯,找了一圈,在viewPager中的内部内继承了,
躲的还是蛮深的,不过这还没有找到我们需要关注的地方,那就继续找,dataSetChanged
void dataSetChanged() {
// This method only gets called if our observer is attached, so mAdapter is non-null.
final int adapterCount = mAdapter.getCount();
mExpectedAdapterCount = adapterCount;
boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 &&
mItems.size() < adapterCount;
int newCurrItem = mCurItem;
boolean isUpdating = false;
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
final int newPos = mAdapter.getItemPosition(ii.object);
if (newPos == PagerAdapter.POSITION_UNCHANGED) {
continue;
}
if (newPos == PagerAdapter.POSITION_NONE) {
mItems.remove(i);
i--;
if (!isUpdating) {
mAdapter.startUpdate(this);
isUpdating = true;
}
mAdapter.destroyItem(this, ii.position, ii.object);
needPopulate = true;
if (mCurItem == ii.position) {
// Keep the current item in the valid range
newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
needPopulate = true;
}
continue;
}
if (ii.position != newPos) {
if (ii.position == mCurItem) {
// Our current item changed position. Follow it.
newCurrItem = newPos;
}
ii.position = newPos;
needPopulate = true;
}
}
if (isUpdating) {
mAdapter.finishUpdate(this);
}
Collections.sort(mItems, COMPARATOR);
if (needPopulate) {
// Reset our known page widths; populate will recompute them.
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (!lp.isDecor) {
lp.widthFactor = 0.f;
}
}
setCurrentItemInternal(newCurrItem, false, true);
requestLayout();
}
}
这里就是我们需要关注的地方了,一看这么多,确实有点头疼,不过,我们只关注重点,看第13行,有句
final int newPos = mAdapter.getItemPosition(ii.object);
这里就调用的了我们的adapter中的getItemPosition,我们再看看getItemPosition会返回什么,会接收什么,复写fragmentStatePagerAdapter中的getItemPosition方法,发现只会返回父类中的方法
接着看父类中的方法
再看看POSITION_UNCHANGED是干嘛用的,
妈蛋,这下总算是明白了,这里一直return POSITION_UNCHANGED;
return一个“未改变”的标志给dataSetChanged()中,它当然打死都不更新咯,请看dataSetChanged()中的第15-17行
竟然知道原因了,那就好做了,直接将要刷新的页面 return POSITION_NONE
FragmentStatePagerAdapter中继承
@Override
public int getItemPosition(Object object) {
if (object.getClass().getName().equals(ProjectFragment.class.getName())
|| object.getClass().getName().equals(ProjectFragment2.class.getName())) {
return POSITION_NONE;
}
return super.getItemPosition(object);
}