6

Using a PagerSlidingTabStrip with a Viewpager inside of a fragment:

  • The main Activity contains a "main fragment" that changes depending on what item you click in navigation drawer.
  • When loading the initial fragment containing the Viewpager everything shows up fine (all pages are populated).
  • Replacing that main fragment with another one and then going back to the viewpager fragment turns every page in the viewpager blank, but the PagerSlidingTabStrip tabs are still there.

Any ideas?

Marcus Gruneau
  • 787
  • 6
  • 6

4 Answers4

20

I had a problem like that

try this

mPager.setAdapter(new BasePagerAdapter(getChildFragmentManager(), getResources()));

you probably have this

mPager.setAdapter(new BasePagerAdapter(getFragmentManager(), getResources()));

EDIT: and in your BasePagerAdapter extend FragmentStatePagerAdapter

public class BasePagerAdapter extends FragmentStatePagerAdapter {
xanexpt
  • 713
  • 8
  • 20
1

Write ur code ie you are using for setting up your pager adapter inside

@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    pager.setAdapter(adapter);
}
Akash
  • 681
  • 3
  • 17
  • 1
    I've tried forcing the adapter to redraw everything via notifydatasetchanged but it does not seem to work. I think it has to with the fragmentmanager. I've tried using getChildFragmentManager instead when initialising the pageradapter but it had no effect. – Marcus Gruneau Mar 26 '15 at 12:19
  • You should use fragementsatepageadapter instead of fragmentpageadapter – Akash Mar 26 '15 at 13:12
1

Replacing getFragmentManager() with getChildFragmentManager() helped me.

ViliusK
  • 11,345
  • 4
  • 67
  • 71
0

Sorry to reply on an old post, but writing this because non of Stackoverflow solutions for my particular problem helped me.

If you are using new architecture components view model with a master detail shared view model and after returning from detail fragment get blank view pager, do the view model initialization in onViewCreated method of master fragment and not in onCreate (only needed in master fragment).

Also as other answers say remember to use childFragmentManager in view pager adapter.

like this:

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    // In the master fragment do the view model initialization in onViewCreated
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, Observer<Item> { item ->
            // Update the UI
        })
    }
}

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, Observer<Item> { item ->
            // Update the UI
        })
    }
}
Pooya
  • 89
  • 3
  • 13