1

我正在使用片段内的 viewpager。我正在使用 pagerAdapter 通过 XML 在两个页面之间切换。这是代码:

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;
    }
}

我这样称呼它:

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;
}

一切正常。但是,如果我移动到 DemoFragment2,然后返回到 DemoFragment1,则不会调用 PagerAdapter。

4

2 回答 2

3

你的 ViewPager 嵌套在一个 Fragment 中,你应该使用 ChildFragmentManager,修改:

mAdapter = new DemoPagerAdapter(getChildFragmentManager());

我还假设 ViewPager 会将屏幕外片段保留在内存中,因此它可能不会getItem(int index)再次调用。添加

viewPager.setOffscreenPageLimit(0);
return rootView;
于 2014-03-05T07:26:40.773 回答
0

好吧,我上周遇到了这个问题。

当我将 放入ViewPager带有 的片段时FragmentPagerAdapter,在我前进到另一个片段并返回后,寻呼机的视图不存在。

我想是FragmentPagerAdapter不会在ViewPager's host Fragment中保留它的视图,它们的生命周期是不一样的。尽管您将VewPager' 的主机 Fragment 放在后堆栈中,但FragmentPagerAdapter' 的 Fragment 没有。然后,我放弃FragmentPagerAdapter尝试了android.support.v4.view.PagerAdapter,(注意,它不会使用片段来注入视图!),一切都很好!

以下是示例:

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;
        }
    }
};

然后在你的onViewCreateorOnCreateView中,放mViewPager.setAdapter(coverPager);

instantiateItem放置页面视图的地方,类似于FragmentPagerAdapter!

就像将FragmentAdapter视图放入ViewPager宿主 Fragment,而不是其他 Fragment!

希望对您有所帮助!

于 2014-03-05T07:22:25.057 回答