Billda
Billda

Reputation: 5997

Fragments in viewpager

I have viewpager with some fragments and i set to each fragment my model class according which UI of fragment should be edited. That model class i set to fragment at constructor before i add that fragment to FragmentStatePagerAdapter. My problem is that after rotating screen or when system kills my application and i restore it, my fragment are recreated by system and my model class instance is lost. Even if I set new FragmentStatePagerAdapter, fragments created by system are visible. Is there any right way of achive that i create new instances of my fragments and place them into viewpager? I tried so many thinks like removing fragments from FragmentManager, adding Adapter to viewpager again, change FragmentStatePagerAdapter only to FragmentPagerAdapter and nothing helped.

My activity class with loading model classes in loader from some resource:

        List<Fragment> visibleFragment = new ArrayList<Fragment>();
        for (Screen screen : wizard.screens) {
            if (screen.visible) {
                visibleFragment.add(new ScreenUI(screen));
            }
        }
        viewPager.setAdapter(null);
        viewPager.setAdapter(new WizardPagerAdapter(getSupportFragmentManager(), visibleFragment));

My FragmentStatePagerAdapter

public class WizardPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments;
private final int count;

public WizardPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    mFragments = fragments;
    count = mFragments.size();
}

@Override
public Fragment getItem(int index) {
    return mFragments.get(index);
}

@Override
public int getCount() {
    return count;
}
}

Upvotes: 0

Views: 472

Answers (2)

Lyd
Lyd

Reputation: 2096

Have you tried using onRetainInstance(true) on your Fragments?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);    
}

Upvotes: 0

alex_pers
alex_pers

Reputation: 21

try add in Manifest android:configChanges="orientation|keyboardHidden|screenSize" to activity.

OR something like that

public class ViewPagerTaskAdapter extends FragmentStatePagerAdapter {
Map<Integer, FragmentViewTask> fragmentsTask = new HashMap<Integer, FragmentViewTask>();
@Override
    public Fragment getItem(int arg0) {
        FragmentViewTask myFragment = FragmentViewTask.newInstance(arg0,
                tasks.get(arg0));
        fragmentsTask.put(arg0, myFragment);
        return myFragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        fragmentsTask.remove(position);
    }
        public FragmentViewTask getFragment(int key) {
        return fragmentsTask.get(key);
    }

    @Override
    public int getCount() {
        if (tasks != null)
            return tasks.size();

        return 0;
    }

}

Upvotes: 1

Related Questions