简体   繁体   English

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

[英]Tabs + ViewPager + FragmentStatePagerAdapter - How to remove fragment?

I'm using the "Tabs + Swipe" project and I'm having a difficult time removing a fragment. 我正在使用“Tabs + Swipe”项目,我很难删除片段。

Steps I'm doing: 我正在做的步骤:

  1. Remove tab from database 从数据库中删除选项卡
  2. Remove tab from the FragmentStatePagerAdapter data source 从FragmentStatePagerAdapter数据源中删除选项卡
  3. Remove tab from the actionBar. 从actionBar中删除选项卡。
  4. Remove fragment using Support FragmentManager. 使用Support FragmentManager删除片段。

The problem: After I perform the remove, for some reason, I can still scroll to the right and see an empty fragment. 问题:执行删除后,由于某种原因,我仍然可以向右滚动并看到一个空片段。 I can't select it, it just bounces back. 我不能选择它,它只是反弹回来。 It seems like the fragment is not being removed but rather changes its position to the tag from the left. 看起来片段没有被移除,而是从左侧将其位置改变为标签。

My Adapter: 我的适配器:

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

My remove method (called from within the fragment): 我的删除方法(从片段内调用):

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
        }

Appreciate the help! 感谢帮助!

you can find the answer here - Remove Fragment Page from ViewPager in Android 你可以在这里找到答案 - 从Android中的ViewPager中删除片段页面

it seems what missing in your code is overwriting of the following adapter's method: 似乎代码中缺少的是覆盖以下适配器的方法:

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

explanation why such "weird" solution works you can find in the answer to the question in the link I provided you. 解释为什么这种“怪异”的解决方案有效,你可以在我提供给你的链接中找到问题的答案。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从ViewPager片段和ViewPagerAdapter制作FragmentStatePagerAdapter - How to make FragmentStatePagerAdapter from ViewPager fragment and ViewPagerAdapter Viewpager + FragmentStatePagerAdapter +片段不起作用 - Viewpager + FragmentStatePagerAdapter + Fragment not working 如何通过fragmentStatePagerAdapter中的fragment从托管viewPager的Fragment中获取数据? - How can fragment in fragmentStatePagerAdapter get data from Fragment hosting the viewPager? 使用FragmentStatePagerAdapter在ViewPager中刷新片段 - Refresh Fragment in ViewPager using FragmentStatePagerAdapter 使用FragmentStatePagerAdapter的ViewPager(嵌套在片段中) - ViewPager (nested in a Fragment) using FragmentStatePagerAdapter 带有fragmentstatepageradapter的Viewpager不会在先前的片段上调用oncreateview - Viewpager with fragmentstatepageradapter does not call oncreateview on a previous fragment 在FragmentStatePagerAdapter管理的选定ViewPager Fragment上,UserVisibleHint为false - UserVisibleHint is false on selected ViewPager Fragment managed by FragmentStatePagerAdapter 如何使用FragmentStatePagerAdapter创建自定义ViewPager? - how to create a custom ViewPager with FragmentStatePagerAdapter? 如何使用ViewPager获取操作栏选项卡中片段的位置 - How to get the position of fragment in Actionbar tabs with viewpager 如何将 Fragment/ViewPager 标签转换为全屏 - How to convert Fragment/ViewPager Tabs to Full Screen
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM