问题:FragmentPagerAdapter因为界面需要刷新farmgent,调用adapter.notifyDataSetChanged() 无效
两个原因:
第一个原因:
当 PagerAdapter.notifyDataSetChanged() 被触发时。该函数将使用 getItemPosition() 的返回值来进行判断,如果为 POSITION_UNCHANGED,则什么都不做;如果为 POSITION_NONE,则调用 PagerAdapter.destroyItem() 来去掉该对象,并设置为需要刷新 (needPopulate = true) 以便触发 PagerAdapter.instantiateItem() 来生成新的对象。
借鉴于http://www.cnblogs.com/dancefire/archive/2013/01/02/why-notifydatasetchanged-does-not-work.html
第二个原因:
当第一个原因解决后,仍然不行,因为pagerAdapter默认会使用缓存中的fragment,看FragmentPagerAdapter源码:
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
很明显,
Fragment fragment = mFragmentManager.findFragmentByTag(name);
是判断是否有缓存的fragment,
所以总结下解决办法:
改两个地方即可:
新建的FragmentAdapter中重新如下方法:
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
重写FragmentAdapter继承的类
public class FragmentMapAdapter3 extends FragmentPagerFlushAdapter {