Tabs + ViewPager + FragmentStatePagerAdapter - 如何删除片段?

时间:2012-11-19 11:44:00

标签: android android-fragments android-fragmentactivity

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

我正在做的步骤:

  1. 从数据库中删除标签
  2. 从FragmentStatePagerAdapter数据源中删除选项卡
  3. 从actionBar中删除标签。
  4. 使用Support FragmentManager删除片段。
  5. 问题: 执行删除后,由于某种原因,我仍然可以向右滚动并看到一个空片段。我不能选择它,它只是反弹回来。 似乎片段没有被移除,而是将其位置从左侧改变为标签。

    我的适配器:

    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
            }
    

    感谢帮助!

2 个答案:

答案 0 :(得分:5)

你可以在这里找到答案 - Remove Fragment Page from ViewPager in Android

似乎代码中缺少的是覆盖以下适配器的方法:

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

解释为什么这种“怪异”解决方案有效,你可以在我提供给你的链接中找到问题的答案。

答案 1 :(得分:0)

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();
        }
    }