ViewPager in TabFragment is not loading a second time
Asked Answered
T

3

53

I'm trying to make an app that has a ViewPager in a Fragment that is part of a TabHost. Everything works out fine. I have my tabbar, I can switch tabs. When I switch to the tab with the ViewPager, all is shown correctly.

However, as soon as I leave this tab with the ViewPager and return this tab, my content is not shown. If I scroll to the side twice I do see my next image and if I go back two times I also see the images are loaded (probably the offscreenloaded).

See that my TabFragment is being reinstantiated when I return to it but the fragments in the ViewPager aren't.

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    mProjectText = (TextView) getView().findViewById(R.id.projectText);
    mProjectText.setText(mActiveProject.getInspirationText());

    mAdapter = new AlbumAdapter(getFragmentManager(), mActiveProject.getInspiration());

    mPager = (ViewPager)getView().findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    super.onActivityCreated(savedInstanceState);
}

public class AlbumAdapter extends FragmentStatePagerAdapter {

private ArrayList<ProjectContent> mItems;

public AlbumAdapter(FragmentManager fm, ArrayList<ProjectContent> items) {
    super(fm);
    this.mItems = items;
}

@Override
public Fragment getItem(int position) {
    return AlbumContentFragment.newInstance(mItems.get(position));
}

@Override
public int getCount() {
    return mItems.size();
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}}

The mockup for the app

Tiedeman answered 6/6, 2013 at 11:14 Comment(0)
T
196

I found the problem. It took me two days, but hey, it's fixed.

Instead of using

mAdapter = new AlbumAdapter(getFragmentManager(), mActiveProject.getInspiration());

You should use

mAdapter = new AlbumAdapter(getChildFragmentManager(), mActiveProject.getInspiration());

So much for 5 characters.

Tiedeman answered 7/6, 2013 at 11:57 Comment(6)
Man you never know how you saved my ass tonight!Anisole
By the way don't bother looking for something like getSupportChildFragmentManager() since getChildFragmentManager() is a method of Fragment and not of Activity...Chen
Perfect, mate, would never have found this without your post.Roselinerosella
It works, but second time if we open fragment, it takes 1 second of lag to display first tab listview. Any solution?Urson
Thanks! This is because we're adding a fragment in a fragment right? But if it's in an Activity, it should be getFragmentManager()? This actually made my day man thanksFlaggy
How did *oogle expect developers to be able to know such thing? Awful design. Anyway thank you.Shaikh
A
49

I been searching this for long finally found a solution.Change your page adapter instance FragmentPagerAdapter to FragmentStatePagerAdapter example:

class PageAdapter extends FragmentStatePagerAdapter {
Anglosaxon answered 5/5, 2015 at 10:41 Comment(5)
Than you, after FragmentPagerAdapter to FragmentStatePagerAdapter it is working. It is Simple and Short answer.Cyclosis
Thanks. Spent to much time on this problem and your simple change worked.Abm
OMG, it resolve me problem, but i found a problem with dynamic height of Fragment in ViewPager, my void OnMeasure can't get height of view when showing at second time.Pliner
The correct answer is the other, but this also works. Thank you all.Nasia
While this works, this does change how the Fragments are loaded and kept in memory. If you want the behavior of a FragmentPagerAdapter, the other solution is the right one.Askance
A
8

you should use getChildFragmentManager() instead of getFragmentManager() and FragmentStatePagerAdapter() instead of FragmentPagerAdapter().Hope it will be useful for someone.

Allgood answered 30/4, 2019 at 4:48 Comment(1)
Hey can you please explain why using FragmentStatePagerAdapter over FragmentPagerAdapter works?Navarrette

© 2022 - 2024 — McMap. All rights reserved.