Gunaseelan
Gunaseelan

Reputation: 15525

Hide tab in FragmentPagerAdapter

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

Answers (1)

kalan nawarathne
kalan nawarathne

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

Related Questions