Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

App crashes when assigning new adapter to my ViewPager

I have a ViewPager which is populated by a FragmentStatePagerAdapter when the app starts:

    ViewPager mViewPager;

    ...

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
    {
        super.onViewCreated(view, savedInstanceState);

        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
        //PageAdapter extends from FragmentStatePagerAdapter
    }

This works fine as it should.

Now, when the user changes the settings of the app I'd like to assign a new Adapter to the ViewPager like this:

@Override
public void updateObserver(SETTING_KEY key) 
{
    mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
    Log.d("info", "updating");
}

Unfortunately the app crashes after calling updateObserver with this exception:

01-22 23:22:45.957: E/AndroidRuntime(13131): FATAL EXCEPTION: main 01-22 23:22:45.957: E/AndroidRuntime(13131): java.lang.IllegalStateException: Fragement no longer exists for key f0: index 0 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:575) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.View.dispatchRestoreInstanceState(View.java:13188) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2850) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2856) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.View.restoreHierarchyState(View.java:13166) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) ...

How do I assign an new Adapter to the ViewPager without crashing the app?

like image 900
user1567896 Avatar asked Jan 22 '14 22:01

user1567896


People also ask

What is the difference between ViewPager and ViewPager2?

ViewPager2 is an improved version of the ViewPager library that offers enhanced functionality and addresses common difficulties with using ViewPager . If your app already uses ViewPager , read this page to learn more about migrating to ViewPager2 .

What is ViewPager2 in android?

ViewPager2 uses FragmentStateAdapter objects as a supply for new pages to display, so the FragmentStateAdapter will use the fragment class that you created earlier. Create an activity that does the following things: Sets the content view to be the layout with the ViewPager2 .

How do I refresh Fragmentstatepageradapter?

You can use startActivityForResult(or broadcast/receiver) to get the result from the activity. Then use adapter. notifyDataSetChanged to refresh the fragment.


2 Answers

Use getFragmentManager() instead of getChildFragmentManager().

like image 139
Basic Coder Avatar answered Nov 15 '22 22:11

Basic Coder


Have you check this thread ? java.lang.IllegalStateException: Fragement no longer exists for key f1: index 3 . Use FragmentPagerAdapter instead of FragmentStatePagerAdapter if you dont care about the Fragment's state restoring when you app go back from background.

like image 25
jobcrazy Avatar answered Nov 15 '22 21:11

jobcrazy