Android TabLayout сохраняет все вкладки в памяти ViewPager, кроме одной

У меня есть TabLayout с 4 вкладками, я хочу сохранить первые 3 вкладки в памяти ViewPager и воссоздавать фрагмент на 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 ответ

Я знаю, что немного опоздал на это.

Вы можете использовать offscreenPageLimit на ViewPagerInstance, чтобы указать количество страниц, чтобы остаться в живых с обеих сторон. Значение по умолчанию равно 1 (также минимальное значение равно 1. Таким образом, вы не можете воссоздать каждый фрагмент. ИМХО это, вероятно, сделано для плавной анимации)

Проверьте эту ссылку документации для подробностей offscreenPageLimit https://developer.android.com/reference/android/support/v4/view/ViewPager

Как указано в документации, будьте осторожны при настройке этого свойства. Это может сделать пользовательский опыт лучше или хуже в зависимости от того, как и где его использовать.

Теперь о второй части вашего вопроса о воссоздании только определенного фрагмента. Проверьте эту документацию по ссылке https://developer.android.com/reference/android/support/v4/app/Fragment

Это в основном должно вызываться всякий раз, когда ваш фрагмент сделан видимым для пользователя или нет.

public class YourFragmentThatNeedsToBeRecreated extends Fragment {

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

Хотя вы можете столкнуться с проблемами при таком подходе. По какой-то причине он не работает идеально (вставьте скандал о фрагментах здесь). Вы можете попробовать присоединить и отсоединить ваш фрагмент в логике обновления. Но я надеюсь, что есть более чистое решение для этого.

Другие вопросы по тегам