标签+ ViewPager + FragmentStatePagerAdapter – 如何删除片段?

我正在使用“Tabs + Swipe”项目,而且我很难删除一个片段。

我正在做的步骤:

  1. 从数据库中删除标签
  2. 从FragmentStatePagerAdapter数据源中删除选项卡
  3. 从actionBar中删除选项卡。
  4. 使用Support FragmentManager删除片段。

问题:执行删除后,出于某种原因,我仍然可以滚动到右侧,看到一个空的片段。 我不能select它,它只是反弹。 似乎这个片段没有被删除,而是将其位置从左侧改变为标签。

我的适配器:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment = new TabFragment(); Bundle args = new Bundle(); args.putInt(TabFragment.ARG_TAB_POSITION, position); fragment.setArguments(args); return fragment; } @Override public int getCount() { return tabsList.size(); } @Override public CharSequence getPageTitle(int position) { return tabsList.get(position).getTitle(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); FragmentManager manager = ((Fragment)object).getFragmentManager(); android.support.v4.app.FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment)object); trans.commit(); } } 

我的删除方法(从片段内调用):

 public void removeTab() { mTabTableHandler.deleteTab(tab.getId()); //db tabsList.remove(tabPosition); //data source actionBar.removeTabAt(tabPosition); // actionbar getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); // support fragmentmanager tabsList = mTabTableHandler.query(); //requery db mSectionsPagerAdapter.notifyDataSetChanged(); //notify adapter } 

感谢帮助!

Solutions Collecting From Web of "标签+ ViewPager + FragmentStatePagerAdapter – 如何删除片段?"

你可以在这里find答案 – 从Android中的ViewPager中删除碎片页面

看起来代码中缺less的是覆盖下面的适配器的方法:

 @Override public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } 

解释为什么这样的“奇怪的”解决scheme的作品,你可以在我提供给你的链接的问题的答案find。

 public void removeAllFragments(ViewGroup container) { /* * keep this line because section pager adapter has * the bug to not delete the last fragment completely * -> so we add an empty fragment */ int iStart = 0; addFragment(new Fragment()); Fragment frag; int size = fragments.size(); for (int iPos = iStart; iPos < size; iPos++) { frag = getItem(iStart); if (frag.isAdded()) { destroyItem(container, iStart, frag); } fragments.remove(frag); notifyDataSetChanged(); } }