Search code examples
androidandroid-viewpagerfragment

Add ViewPager in Fragment in Android


I have two fragments: FirstFragment and SecondFragment. FirstFragment contains ViewPager, which has three pages (three fragments). In the onCreate of activty, I add FirstFragment to main layout, and three pages show normally.

Problem is: when I replace FirstFragment by SecondFragment, and then comeback FirstFragment three pages disappear. Then I scroll ViewPager forward and backward, pages show but only first and third pages show, second page disappear.

Here FirstFragment:

package com.example.bkmsx.afragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstFragment extends Fragment {
    ViewPager mViewPager;
    static MainActivity mainActivity;
    public static FirstFragment newInstance(MainActivity activity){
        mainActivity = activity;
        return new FirstFragment();
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment, null);
        mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
        ViewPagerAdapter adapter = new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
        mViewPager.setAdapter(adapter);
        return view;
    }

    private class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            String text = "";
            switch (position) {
                case 0: text = "First Page";
                    break;
                case 1: text = "Second Page";
                    break;
                case 2: text = "Third Page";
                    break;
            }
            return TextFragment.newInstance(mainActivity, text);
        }

        @Override
        public int getCount() {
            return 3;
        }
    }
}

SecondFragment:

package com.example.bkmsx.afragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class SecondFragment extends Fragment {
    static MainActivity mainActivity;

    public static SecondFragment newInstance(MainActivity activity) {
        mainActivity = activity;
        return new SecondFragment();
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView = new TextView(mainActivity);
        textView.setText("New Fragment");
        return textView;
    }
}

Any suggestion? Thanks in advance.


Solution

  • In FirstFragment , Use this code and try

    public View view; // declare view as global variable
    
    @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            if(view == null){
                  view = inflater.inflate(R.layout.first_fragment, null);
                  mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
                  ViewPagerAdapter adapter = new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
                  mViewPager.setAdapter(adapter);
            }
            return view;
        }
    

    As Divyesh comment has good suggestion there is also need to add

    mViewPager.setOffscreenPageLimit(3);