比如我现在想在图中红色的后面再添加一个Fragment。
本来我的想法是更改数据源重写刷新适配器,如下
list_title.add(list_title.size() - 1, times + "");
list_fragment.add(list_fragment.size() - 1, fragment);
mAdapter.notifyDataSetChanged();
但是运行后发现报错,报错如下:
Caused by: java.lang.IllegalStateException: Can't change tag of fragment FaultHandlingRecordsActivityFragment{256f8536 #2 id=0x7f0f0164 android:switcher:2131689828:2}: was android:switcher:2131689828:2 now android:switcher:2131689828:3
感觉是由于添加的时候修改Fragment的tag,翻看了FragmentPagerAdapter的源码中的instantiateItem方法中有一句makeFragmentName(container.getId(), itemId) 是设置tag的。
itemId又是因为 getItemId方法。
final long itemId = getItemId(position);
@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;
}
public long getItemId(int position) {
return position;
}
试着重写getItemId方法保证每次的id都不一样
@Override
public long getItemId(int position) {
return list_fragment.get(position).hashCode();
}
重新运行了下发现可以添加了,当时内容并没有显示出来。
查看了资料发现,有一个getItemPosition的方法,默认返回如下POSITION_UNCHANGED,表示默认位置的内容没有发生改变。
public int getItemPosition(Object object) {
return POSITION_UNCHANGED;
}
还有一个常量POSITION_NONE表示当前的内容不是原有的内容了,提示会重新绘制。我们使用这个。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
试着运行下果然fragment添加进去了,内容也显示出来了。
总结:
- 添加数据到数据源的相应位置,并刷新适配器
list_title.add(list_title.size() - 1, times + "");
list_fragment.add(list_fragment.size() - 1, fragment);
mAdapter.notifyDataSetChanged();
- 重写FragmentPagerAdapter中的方法
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public long getItemId(int position) {
return list_fragment.get(position).hashCode();
}