6

我有ViewPager4 个标签。

我正在使用扩展的自定义适配器FragmentPagerAdapter

问题是当我更改选项卡时,第一个选项卡Fragment会再次创建,尽管它不是当前可见的。此外,这仅在第四次更改选项卡后才会发生。例如 tab1 -> tab2 -> tab3=> onStopfrom tab1 被调用。-> tab2 =>onCreateView从 tab1 被调用(onAttach不被调用)。

我想避免这种情况。我需要所有选项卡始终保持其状态,即使它们当前未显示也是如此。我怎样才能做到这一点?

4

3 回答 3

24

就像setOffscreenPageLimit()使用ViewPager.

更多信息: http: //developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

于 2013-01-17T19:32:44.783 回答
1

Viewpager 有一个名为setOffScreenPageLimit的公共方法,它指示在空闲状态下将保留到视图层次结构中当前页面任一侧的页面数。

活动:

    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

...

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = findViewById(R.id.container);
        mViewPager.setOffscreenPageLimit(3);  // change your number here
        mViewPager.setAdapter(mSectionsPagerAdapter);
于 2018-08-06T17:52:33.037 回答
0

当您实例化片段时,调用setRetainInstance(true). 这将保留片段的实例状态。onCreateView仍然会被调用,您需要确保重新使用已保存的状态并仅渲染视图而不再次加载任何数据,例如,使用 aboolean表示您的片段是否已被初始化。

你会做这样的事情:

public static class MyAdapter extends FragmentPagerAdapter {
       @Override
       public Fragment getItem(int position) {
               MyFragment myFragment = new MyFragment();
               myFragment.setRetainInstance(true);
               return myFragment;
       }
}

class MyFragment extends Fragment {
       .
       .
       .

       boolean initialized = false;
       ArrayList<MyData> myData = null;

       void onCreate(...) {
               if (initialized) {
                       renderViews();
               } else {
                       initialized = true;
                       loadData();
                       renderViews();
               }
       }
}

您不需要实施onSaveInstanceState(). 它将被自动处理。

于 2013-01-04T13:46:54.010 回答