在屏幕旋转

时间:2015-10-07 07:50:22

标签: android android-viewpager fragment

我有TabLayout和ViewPager,包含2个片段,每个片段都是一个从firebase加载数据的recyclerView。

一切正常。但是当我更改屏幕方向时,ViewPager会重新创建每个片段并重新分段加载数据。

是否可以以及如何在ViewPager中保存片段状态?

但我不想覆盖onSaveInstanceState方法来创建数据集然后恢复它。我想要在检查现有片段时找到像标签一样的东西。

活动

public class MainActivity extends BaseBroadcastActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(mViewPager);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);
}

private void setupViewPager(ViewPager viewPager) {
    Adapter adapter = new Adapter(getSupportFragmentManager());
    adapter.addFragment(MainListFragment.newInstance(connected, "Notices"), "Notices");
    adapter.addFragment(MainListFragment.newInstance(connected, "Posts"), "Posts");
    viewPager.setAdapter(adapter);
}

static class Adapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragments = new ArrayList<>();
    private final List<String> mFragmentTitles = new ArrayList<>();

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

    public void addFragment(Fragment fragment, String title) {
        mFragments.add(fragment);
        mFragmentTitles.add(title);
    }

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

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitles.get(position);
    }
}

在MainListFragment中,我只创建了recyclerView并从firebase加载数据。

谢谢!

修改

感谢您的回复!

我发现了我的错误。当我们第一次创建FragmentPageAdapter以及重新创建活动时会发生什么:

  1. FragmentPageAdapter调用instantiateItem方法,它按标签查找片段,如果片段存在,则适配器使用它,但如果片段不存在,则调用getItem方法并创建片段。

  2. 在我的情况下,片段不会被重新创建,但是数据是刷新的,因为我在片段中的onCreateView方法中刷新它们,但现在我在onCreateView上编辑:

    if(savedInstanceState == null){     retrieveData(); }

1 个答案:

答案 0 :(得分:1)

应该以{{1​​}}中始终返回新实例的方式完成。我还宁愿使用getItem(),尤其是当您有更多页面时。 您还需要保存FragmentStatePagerAdapter中可能丢失的每个内部状态。如果您不想重新加载,则需要保存数据。如果POJO中有一些数据,可以向它们添加onSaveInstanceState()接口,以便将它们轻松地序列化为bundle。

片段上也有setRetainInstance(),但它总是给我带来一些奇怪的行为,所以我没有使用它。

Serializable