在fragmentpageadapter的instantiateItem方法里,首先设置此Fragment的标记,然后从FragmentManager中的mAdded集合里面去查找有没有相关标记的fragment如果有就直接从集合中获取使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以更新adapter数据是没有作用的
String name = makeFragmentName(container.getId(), itemId); //设置fragment标记
Fragment fragment = mFragmentManager.findFragmentByTag(name); //从mAdded中查找
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));
}
解决思路:
1,重新创建新类继承继承PagerAdapter,创建集合mFragments
2,将新创建的Fragment的添加到mFragments集合中
3,在数据变化(notifyDataSetChanged)的时候,将mFragments集合清空,在instantiateItem函数里面判断有无缓存的时候加mFragments判断
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null && mFragments != null && mFragments.containsKey(position)) {
if (DEBUG) android.util.Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
try {
if (fragment != null) {
mCurTransaction.remove(fragment);
}
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
mFragments.put(position, fragment);
} catch (Exception e) {
e.printStackTrace();
}
}
代码:点击打开链接