Ferose
Ferose

Reputation: 21

PagerAdapter not called inside fragment when I move to the fragment for the second time in Android

I'm working with viewpager inside fragments. I'm using pagerAdapter to switch between two pages via XML. Here is the code:

public class DemoPagerAdapter extends FragmentPagerAdapter {

    public DemoPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {
        Fragment f;
        switch (index) {
        case 0:
            f = new FirstFragment(); 
            break;
        case 1:
            f =  new SecondFragment();
            break;
        }
        return f;
    }

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

And I'm calling it like this:

public class DemoFragment1 extends Fragment {
private ViewPager viewPager;
private DemoPagerAdapter mAdapter;
public DemoFragment1() {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.security, container, false);
    mAdapter = new DemoPagerAdapter(getActivity().getSupportFragmentManager());
    viewPager.setAdapter(mAdapter);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
                        showPages(position);
        }
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    return rootView;
}

Everything works fine. But if I move to DemoFragment2 and then come back to DemoFragment1, PagerAdapter is not called.

Upvotes: 1

Views: 676

Answers (2)

longkai
longkai

Reputation: 3698

Well, I encontered this issue last week.

When I put the ViewPager in the fragment with a FragmentPagerAdapter, after I move forward to anoter Fragment and back, the pager' s view not exists.

I supposed is the FragmentPagerAdapter won' t retain its view in the ViewPager ' s host Fragment, Their life cycle is not the same. Though you put the VewPager' s host Fragment in the back stack, but the FragmentPagerAdapter' s fragment not. And Then, I gave up FragmentPagerAdapter and tried android.support.v4.view.PagerAdapter, (note, it wont' t use fragment to inject view!), everything is fine!

below is the sample:

private final PagerAdapter coverPager = new PagerAdapter() {

    private LayoutInflater mLayoutInflater;

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

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mLayoutInflater == null) {
            mLayoutInflater = LayoutInflater.from(getActivity());
        }
        switch (position) {
            case 0:
                View frontPage = mLayoutInflater.inflate(R.layout.profile_cover, container, false);
                ImageView avatar = (ImageView) frontPage.findViewById(R.id.avatar);
                Picasso.with(getActivity())
                        .load(mAvatarUrl)
                        .placeholder(R.drawable.error)
                        .error(R.drawable.error)
                        .into(avatar);
                TextView screenName = (TextView) frontPage.findViewById(R.id.screen_name);
                screenName.setText("@" + mScreenName);
                TextView remark = (TextView) frontPage.findViewById(R.id.remark);
                remark.setText(TextUtils.isEmpty(mRemark) ? mScreenName : mRemark);
                if (mVerified) {
                    frontPage.findViewById(R.id.verified).setVisibility(View.VISIBLE);
                }
                container.addView(frontPage);
                return frontPage;
            case 1:
                View introPage = mLayoutInflater.inflate(R.layout.profile_intro, container, false);
                CatnutUtils.setText(introPage, R.id.description, TextUtils.isEmpty(mDescription)
                        ? getString(R.string.no_description) : mDescription);
                CatnutUtils.setText(introPage, R.id.location, mLocation);
                CatnutUtils.setText(introPage, R.id.profile_url, Constants.WEIBO_DOMAIN + mProfileUrl);
                container.addView(introPage);
                return introPage;
            default:
                return null;
        }
    }
};

and then in your onViewCreate or OnCreateView, put mViewPager.setAdapter(coverPager);

the instantiateItem is the place to put the page' s view, similar like the FragmentPagerAdapter!

It' s just like put the FragmentAdapter' s view int the ViewPager' s host Fragment, not the other fragment!

Hope it' s helpful!

Upvotes: 0

Suau
Suau

Reputation: 4738

Your ViewPager is nested in a Fragment, you should use the ChildFragmentManager, modify:

mAdapter = new DemoPagerAdapter(getChildFragmentManager());

I also assume the ViewPager will keep the off screen fragment in memory, thus it might not call getItem(int index) again. Add

viewPager.setOffscreenPageLimit(0);
return rootView;

Upvotes: 3

Related Questions