简体   繁体   中英

Android: how to replace/delete a fragment inside section pager adapter in TabLayout

:)

I'm writing an Android app which do a lot of things, but i have an issue with java GUI code and i'm not able to go on.

What I would like to achieve is a TabLayout gui user-editable. The user could add , remove or modify section. I write all the code that let me add section. To do this i used a Section Pager Adapter as shown

class SectionsPagerAdapter extends FragmentPagerAdapter {

public ArrayList<Fragment> mfragList;
public ArrayList<String> mfragtit;

public SectionsPagerAdapter(FragmentManager fm, ArrayList<Fragment> mFragList, ArrayList<String> mFragTit) {
    super(fm);
    this.mfragList=mFragList;
    this.mfragtit=mFragTit;
}

@Override
public Fragment getItem(int position) {
    return this.mfragList.get(position);
}

@Override
public int getCount() {
    return this.mfragList.size();
}

@Override
public CharSequence getPageTitle(int position) {

    return this.mfragtit.get(position);
}

public void addFrag(Fragment frag, String tit){
    this.mfragList.add(frag);
    this.mfragtit.add(tit);

}

public void delFrag(int index){
    this.mfragList.remove(index-1);
    this.mfragtit.remove(index-1);
}
}

Well, i'm new in Android and what i've understand about this code is that this class, when called, takes two Arraylist: mfragList and mfragtit which contains the fragment of each section and its title. Then when this adapter is created it is set as the adapter of view pager, which it should be the object that contain the view.

So I get the first issue when i tried to delete one section. To do this i thought to delete both title and fragment from adapter, then notifydatasetChanged and then set again the adapter for the view pager. But it actually don't works (even if I only notifydatasetChanged while don't set adapter again).

What I do in MainActivity is something like this:

                        ad.delFrag(parseInt(elim_i)+1); //ad is the adapter declared as field 
                        ad.notifyDataSetChanged();
                        mViewPager.setAdapter(ad);
                        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
                        tabLayout.setupWithViewPager(mViewPager);

The issue was that it delete the right title but the wrong fragment, infact it ever delete the last fragment in mfragList

Any help gonna be appreciated.

Thank you guys.

Nico

FragmentAdapter internal have cache with loaded fragment. So that it's behaving like this. Try this adapter

public class MainActivity extends AppCompatActivity {


    private TabLayout mTabLayout;

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        List<Fragment> fragmentList = new ArrayList<>();
        List<String> title = new ArrayList<>();

        for (int i =0; i < 3; i++) {
            fragmentList.add(new SampleViewPagerFragment());
            title.add("Fragment #" + i);
        }

        final CustomPagerAdapter adapter = new CustomPagerAdapter(fragmentList, title);
        mViewPager.setAdapter(adapter);

        mTabLayout.setupWithViewPager(mViewPager);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                adapter.removeFragmentAtPosition(2);
            }
        }, 3000);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                adapter.addFragmentToAdapter("Title", new SampleViewPagerFragment());
            }
        }, 6000);

    }


    private static class CustomPagerAdapter extends PagerAdapter {

        private List<Fragment> mFragmentList = new ArrayList<>();
        private List<String> mTitle = new ArrayList<>();

        CustomPagerAdapter(List<Fragment> mFragmentList, List<String> mTitle) {
            this.mFragmentList = mFragmentList;
            this.mTitle = mTitle;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            return mFragmentList.get(position);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
            container.removeViewAt(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mTitle.get(0);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return (view == object);
        }


        void removeFragmentAtPosition(int position) {
            mTitle.remove(position);
            mFragmentList.remove(position);

            notifyDataSetChanged();
        }

        void addFragmentToAdapter(String title, Fragment fragment) {
            mTitle.add(title);
            mFragmentList.add(fragment);

            notifyDataSetChanged();
        }
    }


}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM