选项卡 + 视图翻页器 + 片段状态适配器 - 如何移除片段?

10

我正在使用“Tabs + Swipe”项目,但是在删除碎片时遇到了困难。

我所做的步骤:

  1. 从数据库中删除标签
  2. 从FragmentStatePagerAdapter数据源中删除标签
  3. 从操作栏中删除标签。
  4. 使用Support FragmentManager删除碎片。

问题: 在执行删除后,由于某种原因,我仍然可以向右滚动并看到一个空碎片。我无法选择它,只能反弹回来。 似乎碎片没有被删除,而是将其位置更改为从左侧标记。

我的适配器:

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

我的remove方法(从片段中调用):

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个回答

5
您可以在这里找到答案 - 在Android中从ViewPager中删除Fragment页面 看起来您的代码中缺少以下适配器方法的重写:
@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

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


挽救了我,非常好的解决方案。 - behelit

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接