Java – Can I add/remove tabs from ViewPager at runtime?

Can I add/remove tabs from ViewPager at runtime?… here is a solution to the problem.

Can I add/remove tabs from ViewPager at runtime?

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.v(TAG, "onCreateView");

View rootView = inflater.inflate(R.layout.fragment_home, container, false);

 setting up the view pager and tab layout
    mViewPager = (ViewPager) rootView.findViewById(R.id.view_pager);
    mTabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout);
    PageAdapter adapter = new PageAdapter(getFragmentManager());
    mViewPager.setAdapter(adapter);

mTabLayout.setupWithViewPager(mViewPager);
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));

return rootView;
}

My custom pager adapter looks like this:

public class PageAdapter extends FragmentStatePagerAdapter {

public PageAdapter(FragmentManager fm) {
        super(fm);
    }

@Override
    public Fragment getItem(int position) {
        return new GroupTabFragment(position);
    }

@Override
    public CharSequence getPageTitle(int position) {
        String title = "";
        switch (position) {
            case 0:
                title = "Game";     this is from a template, i have to
                break;              return title dynamically
            case 1:
                title = "Movie";
                break;
        }
        return title;
    }

@Override
    public int getCount() {
        return 2;                   the tabs number is a subject of change
    }                              // i don't know it from the begining
}

The problem I’m having is that I have to add or remove tabs when clicking a button, or something like that.

Each tab displays a classic list of objects.
Thank you.

Solution

Although ViewPager has two ways to do this, it is not suitable for dynamic deletion:

1) Fragment< via ArrayList > data as parameters to the PageAdapter

The adapter looks like this:

public class PageAdapter extends FragmentStatePagerAdapter {
private ArrayList<Fragment> data;

public PageAdapter(FragmentManager fm, ArrayList<Fragment> data) {
    super(fm);
    this.data = data;
}

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

@Override
public CharSequence getPageTitle(int position) {
    String title = "";
    switch (position) {
        case 0:
            title = "Game";     this is from a template, i have to
            break;              return title dynamically
        case 1:
            title = "Movie";
            break;
    }
    return title;
}

@Override
public int getCount() {
    return data.size();                   the tabs number is a subject of change
}                              // i don't know it from the begining

To delete the project you executed in Activity\Fragment:

data.remove(fragmentId);
adapter.notifyDataSetChanged();

2) Recreate the adapter each time you want to delete the project. So you basically create a new adapter with the new data.

data.remove(fragmentId);
PageAdapter adapter = new PageAdapter(getFragmentManager(), data);
mViewPager.setAdapter(adapter);

Related Problems and Solutions