Reputation: 15525
I need to hide the second tab on particular condition, I have tried in following way, Tab hided, and text also changed, but fragment didn't changed, I mean, If I hided the second tab then I am getting FragmentStep2
[second tab's content] on third tab,
public class PagerAdapter extends FragmentPagerAdapter {
private static final String TAG = "PagerAdapter";
private final String[] TITLES_WITH_STEP2 = {"step1", "step2", "step3", "step4"};
private final String[] TITLES_WITHOUT_STEP2 = {"step1", "step3", "step4"};
private ArrayList<Fragment> fragmentsList;
private boolean isShowStep2Tab = true;
public PagerAdapter(FragmentManager fm) {
super(fm);
fragmentsList = new ArrayList<>();
fragmentsList.add(new FragmentStep1());
fragmentsList.add(new FragmentStep2());
fragmentsList.add(new FragmentStep3());
fragmentsList.add(new FragmentStep4());
}
@Override
public CharSequence getPageTitle(int position) {
Log.v(TAG, "getPageTitle isShowStep2Tab : " + isShowStep2Tab);
fragmentsList = new ArrayList<>();
return isShowStep2Tab ? TITLES_WITH_STEP2[position] : TITLES_WITHOUT_STEP2[position];
}
@Override
public Fragment getItem(int position) {
/*Log.v(TAG, "getItem isShowStep2Tab : " + isShowStep2Tab);
if (getPageTitle(position).equals("Step1")) {
return new FragmentStep1();
} else if (getPageTitle(position).equals("Step2")) {
return new FragmentStep2();
} else if (getPageTitle(position).equals("Step3")) {
return new FragmentStep3();
} else if (getPageTitle(position).equals("Step4")) {
return new FragmentStep4();
}else {
return new FragmentStep4();
}*/
return fragmentsList.get(position);
}
@Override
public int getCount() {
Log.v(TAG, "getCount isShowStep2Tab : " + isShowStep2Tab);
fragmentsList = new ArrayList<>();
return isShowStep2Tab ? TITLES_WITH_STEP2.length : TITLES_WITHOUT_STEP2.length;
}
public void setShowFamilyTab(boolean isShowStep2Tab) {
this.isShowStep2Tab = isShowStep2Tab;
fragmentsList = new ArrayList<>();
if (isShowStep2Tab) {
fragmentsList.add(new FragmentStep1());
fragmentsList.add(new FragmentStep2());
fragmentsList.add(new FragmentStep3());
fragmentsList.add(new FragmentStep4());
} else {
fragmentsList.add(new FragmentStep1());
fragmentsList.add(new FragmentStep3());
fragmentsList.add(new FragmentStep4());
}
notifyDataSetChanged();
}
}
I don't know what is the problem here.
Upvotes: 0
Views: 1475
Reputation: 2014
I would suggest you to pass only position to the getItem
method of the adapter.
@Override
public Fragment getItem(int i) {
Fragment fragment = new DemoObjectFragment();
Bundle args = new Bundle();
args.putInt(DemoObjectFragment.ARG_OBJECT, i); // Our object is just an integer :-P
fragment.setArguments(args);
return fragment;
}
After that, you could get the position from your list of objects ( your pages) and check for condition (to show or not to show).
in your DemoObjectFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_collection_object, container, false);
Bundle args = getArguments();
FragmentPageToShow tempFragmentPage = fragmentDataList.get(args.getInt(ARG_OBJECT));
Use the same list of objects when you create the fragment page adapter.
public static class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
private Fragment mCurrentFragment;
public Fragment getCurrentFragment() {
return mCurrentFragment;
}
public DemoCollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new DemoObjectFragment();
Bundle args = new Bundle();
args.putInt(DemoObjectFragment.ARG_OBJECT, i); // Our object is just an integer :-P
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// For this contrived example, we have a 100-object collection.
return fragmentDataList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentDataList.get(position).name;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
if (getCurrentFragment() != object) {
mCurrentFragment = ((Fragment) object);
}
super.setPrimaryItem(container, position, object);
}
}
Do not create FragmentStepX
classes for each page. Just use one Fragment and pass data appropriately.
Either create array list of your data objects initially only for 'objects to show' or refresh your adapter dynamically whenever your array list changes.
You could always have the list of items to show before setting/refreshing the adapter.
Upvotes: 1