我的Activity
包含ViewPager
和它的定制Adapter
延伸FragmentStatePagerAdapter
。 ViewPager
包含3个片段
用于从ViewPager中删除片段的代码
MainActivity
public void deleteElement(){
final int currentItem = mViewPager.getCurrentItem();
mPagerAdapter.removeItem(currentItem);
mPagerAdapter.notifyDataSetChanged();
}
CustomPagerAdapter
private ArrayList<Item> data;
public void removeItem(int index){
data.remove(index);
}
删除中间Fragment
(索引1)时:
data
我正在删除正确的item
。Fragment
3在notifyDataSetChanged
之后删除,当前的Fragment
仍然是用户看到的片段,正在加载的数据来自SavedInstance
包所以最终的结果是用户仍然看到他试图删除的Fragment
相同,这对他来说有点糟糕。
想法?
尝试添加此:
private class MyPagerAdapter extends FragmentStatePagerAdapter {
//... your existing code
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
}
你别无选择,只能实施PagerAdapter#getItemPosition
。查看ViewPager确定如何更新其位置的来源,在notifyDataSetChanged
之后添加新片段或删除死片段。它不应该太难,你只需要访问传递的片段的状态,你还需要访问活动中的主状态,它保存你的订单。
它还需要您实现getItemId
以返回每个片段的一致ID,因为它们可以重新排序。
这是我在ViewPager照片中处理它的方式。
private inner class PhotoPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
override fun getItem(position: Int): PhotoViewFragment {
// getItem is called to instantiate the fragment for the given page.
return PhotoViewFragment.newInstance(position, [email protected][position])
}
override fun getItemId(position: Int): Long {
return [email protected][position].ID!!.hashCode().toLong()
}
override fun getItemPosition(`object`: Any): Int {
val frag = `object` as PhotoViewFragment
val idx = [email protected] { ph -> ph.ID == frag.dataBinding.photo.ID }
return if (idx >= 0) idx else PagerAdapter.POSITION_NONE
}
override fun getCount(): Int {
return [email protected]
}
}
您可以尝试使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。问题是,我也遇到过这个问题,它帮助了我。
您必须先将适配器设置为null,然后再将其设置为:
int currentPosition = mViewPager.getCurrentItem();
mPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(null);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setCurrentItem(currentPosition);