1

I a using android ViewPager to swipe through number of views. Each view has some UI elements such as EditText or Radio Button. The selections I made on the the radio button are lost when I come back after going forward few views.

How can I implement the view pager to retain my selections/inputs. Here is how I declared my PagerAdapter,

private class QuestionsSlidePagerAdapter extends FragmentStatePagerAdapter {
        public QuestionsSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

When I set setOffscreenPageLimit above 1 I am getting back this crash log,

 java.lang.IllegalStateException: Recursive entry to
 executePendingTransactions at
 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1585) at
 android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at
 android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) at 
 android.support.v4.view.ViewPager.populate(ViewPager.java:1106) at android.support.v4.view.ViewPager.populate(ViewPager.java:952) at
 android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733) at
 com.mobytz.handyman.postjob.QuestionsFragment.onActivityCreated(QuestionsFragment.java:116) at
 android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1970) at
 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092) at
 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at
 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at
 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at
 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) at android.os.Handler.handleCallback(Handler.java:739) at 
 android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at 
 android.app.ActivityThread.main(ActivityThread.java:6837) at java.lang.reflect.Method.invoke(Native Method) at 
 java.lang.reflect.Method.invoke(Method.java:372) at
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Thanks.

petey
  • 16,914
  • 6
  • 65
  • 97
Zach
  • 9,989
  • 19
  • 70
  • 107

2 Answers2

2

it has nothing to do with view pager. You just need to add some model class /sharedPreferences /contentProvider which will hold your information for every fragment and load it onResume and save in onPause.

For small ViewPagers you can use

    int numberOfPagesOffScreen=2
    mViewPager = (ViewPager)findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(numberOfPagesOffScreen);

but i wont suggest it for a large number of pages

wojciech_maciejewski
  • 1,277
  • 1
  • 12
  • 28
1

You can set the off screen page limit of your ViewPager, and then the hidden fragments will not be recreated when you navigate to them. For example, if you have a total of six tabs, you would set the off-screen limit to 5.

ViewPager viewPager = (ViewPager)findViewById(R.id.view_pager);
viewPager.setOffScreenPageLimit(5); 

You must be careful of the performance impact of keeping extra fragments in memory, but this should point you in the right direction.

TheoKanning
  • 1,631
  • 11
  • 20
  • Thanks. I have tried that but app is crashing, Please see the updated question – Zach Dec 22 '15 at 18:31
  • This might be what you're looking for: http://stackoverflow.com/questions/22150950/recursive-entry-to-executependingtransactions Tabs are typically fragments within fragments, so you have to use getChildFragmentManager() to prevent this recursive behavior. – TheoKanning Dec 22 '15 at 18:37