Reputation: 2079
I have TabLayout and ViewPager with 2 fragments, each of them is a recyclerView that load data from firebase.
All works fine. But when I change screen orientation ViewPager recreate each fragment and fragments load data again.
Is it possible and how to save fragment state in ViewPager?
But I do not want to override onSaveInstanceState method for creating data set and then restore it. I want something like find fragment by tag when check existing fragment.
Activity
public class MainActivity extends BaseBroadcastActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mViewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(mViewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
private void setupViewPager(ViewPager viewPager) {
Adapter adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(MainListFragment.newInstance(connected, "Notices"), "Notices");
adapter.addFragment(MainListFragment.newInstance(connected, "Posts"), "Posts");
viewPager.setAdapter(adapter);
}
static class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public Adapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
In MainListFragment I only create recyclerView and load data from firebase.
Thank You!
EDIT
Thank You for responding!
I find my error. What's happen when we create FragmentPageAdapter at first time and when we recreate activity:
FragmentPageAdapter call instantiateItem method where it find fragment by tag and if fragment exists adapter use it, but if fragment does not exist adapter call getItem method and create fragment.
In my situation fragments are not recreated, but data is refreshing because I refresh them in onCreateView method in fragment, but now I am edit onCreateView:
if (savedInstanceState == null) { retrieveData(); }
Upvotes: 2
Views: 2868
Reputation: 558
It should be done in the way that you return new instance always in getItem()
. I would also rather use FragmentStatePagerAdapter
especially when you have more pages.
You also need to save every internal state that can be lost in onSaveInstanceState()
. If you don't want to reload, you'll need to save the data. If you have some data in POJOs, you can add Serializable
interface to them to serialize them easily into bundle.
There is also setRetainInstance() on fragment, but it always caused some weird behavior for me, so I'm not using it.
static class Adapter extends FragmentStatePagerAdapter {
public Adapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment=null;
switch (position) {
case 0: fragment=MainListFragment.newInstance(mConnected, "Notices"); //don't forget to save mConnected in savedInstanceState
case 1: fragment=MainListFragment.newInstance(mConnected, "Posts");
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
String title="";
switch (position) {
case 0: title="Notices";
case 1: title="Posts";
}
return title;
}
Upvotes: 1