5

I hav a problem. I have a fragment, which contains viewpager inside. For viewpager i use FragmentPagerAdapter extension. There are recycler views inside of each pager fragment. The question is that i can't restore scroll position after screen rotation inside recycler views of viewpager. I thought that problem is in recyclerview, but soon i found out that after screen rotation fragments inside viewpager are being recreating, so onCreate() and onDestroy() are called, even though they shouldn't. I also tried use onSaveInstanceState(bundle) and found out that inside onCreateView() this bundle is always null. So what should i do? This topic didn't help me.

Community
  • 1
  • 1
Geron Thunder
  • 81
  • 1
  • 6
  • Could you try using mViewPager.setOffscreenPageLimit(limit); – dex Nov 02 '15 at 16:48
  • @dex, i tried. it did not help me. actually, it shouldn't because viewpager saves fragments' state when i swipe it, but when i rotate screen, position is got lost. sorry for my english – Geron Thunder Nov 02 '15 at 17:15

3 Answers3

3

Well, i have found an answer. The problem is in me). There is hierarchy : MainActivity with frame layout for fragment - PagerFragment which contains viewpager - fagments inside viewpager. The problem is that after screen rotation inside of activity i was allways replacing PagerFragment, such as:

android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragment = new PagerFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();

but i should do this:

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (fragment == null) {
        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragment = new PagerFragment();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
}

It was completely my fault and i am ashamed. I am sorry.

Geron Thunder
  • 81
  • 1
  • 6
0

You can override function in your PagerAdapter with null state.

override fun restoreState(state: Parcelable?, loader: ClassLoader?) {
        super.restoreState(null, loader)
    }
0

Those two overrides should solve your problem

here you save your values

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

and here you can restore it

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
}
Kmelliti
  • 101
  • 7