使用场景
点击按钮删除当前ViewPager正在显示的Fragment,并将使用ViewPager显示被删除Fragment的上一个。
解决方案
在FragmentPagerAdapter的实现类中添加一下代码即可,即重写两个方法
@Override
public long getItemId(int position) {
//确保返回的值唯一即可
return mDemoFragmentList.get(position).hashCode();
}
@Override
public int getItemPosition(Object object) {
//此Item不再显示
return POSITION_NONE;
}
两个方法理解
方法getItemPosition
触发删除操作时,首先根据索引从数据源移除对应的Fragment对象,然后当调用PagerAdapter.notifyDataSetChanged()时,接着调用ViewPager.dataSetChanged();在此方法中,遍历每一个Item,获取对应一个int值POSITION_NONE或者POSITION_UNCHANGED。如果返回POSITION_UNCHANGED,此方法会continue中止,之后的销毁Fragment操作不会执行,返回POSITION_NONE,反之。每个Item都返回POSITION_NONE,那么ViewPager就没有Fragment与它关联。
方法getItemId
接着对上一个方法的理解,当所有的item都返回POSITION_NONE方法时,所有的Fragment都从ViewPager中分离,那此时getCount()返回的数量大于0,所以ViewPager重新创建Item,而Adapter.instantiateItem会再次被调用,instantiateItem获取Fragment有两种方式,第一种是FragmentManager中获取(相当于获取缓存中的),第二种是再次调用getItem()获取新的Fragment同时添加到FragmentManager中,我们重写getItemId,每次返回的ItemID都不一样,防止从缓存中获取。