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