使用ViewPager时,不会调用CreateView上的片段

时间:2017-09-12 14:24:03

标签: android android-viewpager fragment fragment-oncreateview

我正在开发一个Android应用程序,我的MainActivity中有一个ViewPager,由3个片段组成。 问题如下,当我滑动到第3个片段,然后回到第1个片段时,调用片段1的onCreateView,这是我真正想要的,但是,如果我只转到第2个片段,然后返回到第一个,onCreateView没有被调用! 我需要找到解决这个问题的方法,我花了好几个小时试图找到一个解决方案但却不知道要解决它。 这是与MainActivity中的ViewPager相关的代码

    private void setupViewPager(final ViewPager viewPager) {
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new voting(), "ONE");
    adapter.addFrag(new dashboard(), "TWO");
    adapter.addFrag(new chats(), "THREE");
    myAdapter=adapter;
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(0);
}

private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<Fragment>();
    private final List<String> mFragmentTitleList = new ArrayList<String>();

    private ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        Log.i("getItem","getItem");
        return mFragmentList.get(position);
    }


    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    private void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    //added newly
    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

这是FragmentPagerAdapter的预期行为。如果片段已经创建并且仍在内存中,则它只是重新附加到ViewPager。因此,onCreateView(...)不再被称为第二次的原因。

  

PagerAdapter的实现,它将每个页面表示为片段,只要用户可以返回到页面,该片段就会持久保存在片段管理器中。

您使用的FragmentStatePagerAdapterFragmentPagerAdapter的子类,因此它会继承此行为。

通常,在每次更改页面时重新创建视图并不是一个好主意,因为这样做很昂贵并且可能导致非平滑滚动。如果您在onCreateView(...)中有一些逻辑要在每次更改片段时再次运行,那么我建议您查看ViewPager.OnPageChangedListener