2

I have a FragmentList with some items. If I click an item the appropriate Fragment will open which contains a Viewpager. No problem so far but if I go back to the List and click the item again the method getItem(int position) is not called anymore.
Here a link with a similar problem:
Display fragment viewpager within a fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.activity_fragment_runtime, container, false);
    mViewPager = (ViewPager) view.findViewById(R.id.pager);
    indicator = (TitlePageIndicator) view.findViewById(R.id.indicator);
    MyFragmentPagerAdapter mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getActivity().getSupportFragmentManager());
    mViewPager.setAdapter(mMyFragmentPagerAdapter);
    indicator.setViewPager(mViewPager);

    return view; 
  }

class MyFragmentPagerAdapter extends FragmentStatePagerAdapter implements TitleProvider {

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

    @Override
    public String getTitle(int position) {

        return muxbusTitles[position];
    }

    @Override
    public Fragment getItem(int location) {

        return muxbusFragmentList.get(location);
    }

    @Override
    public int getCount() {

        return muxbusTitles.length;
    }

}

    return view;

}

Edit: If someone is interested,the solution was to extends from PagerAdapter instead of FragmentStatePagerAdpater because the Viewpager is already in a Fragment..

Community
  • 1
  • 1

1 Answers1

0

I did have similar problem and after scratching my head for quite some time i made an my own understanding (assumption) that ViewPager is keeping the reference of its child fragments into memory even the hosted Fragment or Activity is destroyed (didn't tested with Activity). So i wrote this method freeFragmentsFromViewPager(). You need to call it from onDestroy() of your Fragment.

     /**
     * This method free the child fragments from ViewPager as ViewPager keeps the reference
     * of child fragments into memory and next time when you again come to visit view pager it won't show the fragment layout
     * because it has the reference to the fragment whilst the fragment's view was already destroyed.
     */
    private void freeFragmentsFromViewPager()
    {
        for(int i = 0; i < TabsFragmentPagerAdapter.fragments.length; i++)
        {
            Fragment fragment = TabsFragmentPagerAdapter.fragments[i];

            if(fragment != null)
            {
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();  
                fragmentTransaction.remove(fragment);
                fragmentTransaction.commit();

                TabsFragmentPagerAdapter.fragments[i] = null;
            }       
        }   
    }

And this is my Adapter code

public class TabsFragmentPagerAdapter extends FragmentPagerAdapter
{
    public static final int NUM_TABS = 3;

    public static Fragment[] fragments = new Fragment[NUM_TABS];

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

    @Override
    public Fragment getItem(int position)
    {
        Log.e("TabsFragmentPagerAdapter", "getItem");

        Fragment fragment = TabsFragmentFactory.newInstace(position);

        fragments[position] = fragment;

        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) 
    {
        return TabsFragmentFactory.getName(position);
    }
Muhammad Babar
  • 8,084
  • 5
  • 39
  • 56