Android TabLayout保留ViewPager内存中的所有选项卡,除了一个

时间:2017-09-28 20:05:14

标签: android android-fragments android-viewpager android-tablayout

我有一个带有4个选项卡的TabLayout,我想要的是保留ViewPager内存中的前3个选项卡,并在每次选中此选项卡时在第4个选项卡中重新创建片段,这可能吗?

这是我的适配器:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
        private Fragment[] mFragments;

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            mFragments = new Fragment[4];
            mFragments[0] = PlaceholderFragment.newInstance(0);
            mFragments[1] = PlaceholderFragment.newInstance(1);
            mFragments[2] = PlaceholderFragment.newInstance(2);
            mFragments[3] = PlaceholderFragment.newInstance(3);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragments[position];
        }

        @Override
        public int getCount() {
            // Show 4 total pages.
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return null;
                case 1:
                    return null;
                case 2:
                    return null;
                case 3:
                    return null;
            }
            return null;
        }
    }

1 个答案:

答案 0 :(得分:0)

我知道我来晚了。

您可以在ViewPagerInstance上使用offscreenPageLimit来指定要在任一侧保持活动状态的页面数。默认值为1(最小值也为1。所以不能重新创建每个片段。恕我直言,这可能是为平滑动画制作的)

检查此文档链接以获取详细信息offscreenPageLimit https://developer.android.com/reference/android/support/v4/view/ViewPager#setoffscreenpagelimit

如文档中所指定,调整此属性时要小心。根据使用方式和使用地点,它可以使用户的体验更好或更糟。

现在是有关仅重新创建特定片段的问题的第二部分。检查此文档链接https://developer.android.com/reference/android/support/v4/app/Fragment#setUserVisibleHint(boolean)

只要您的片段对用户可见还是不可见,都应该调用此

public class YourFragmentThatNeedsToBeRecreated extends Fragment {

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
      // write your refresh logic here
    }
  }

尽管使用此方法可能会遇到问题。由于某些原因,它无法完美运行(在此处插入有关片段的咆哮声)。您可以尝试在刷新逻辑中附加和分离片段。但我希望有一个更清洁的解决方案。