Tabs + ViewPager + FragmentStatePagerAdapter - How to remove fragment?

假如想象 提交于 2019-12-08 15:48:03

问题


I'm using the "Tabs + Swipe" project and I'm having a difficult time removing a fragment.

Steps I'm doing:

  1. Remove tab from database
  2. Remove tab from the FragmentStatePagerAdapter data source
  3. Remove tab from the actionBar.
  4. Remove fragment using 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!


回答1:


you can find the answer here - Remove Fragment Page from ViewPager in Android

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.




回答2:


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


来源:https://stackoverflow.com/questions/13453077/tabs-viewpager-fragmentstatepageradapter-how-to-remove-fragment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!