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