Предотвратить ViewPager от разрушения за пределами экрана

133

У меня ViewPager подключен к FragmentPagerAdapter, который отображает три фрагмента. Похоже, что ViewPager уничтожает вид размещенного фрагмента, когда он находится на расстоянии более одного удара от текущей позиции.

Все эти представления являются простыми списками, и эта оптимизация совершенно не нужна, поэтому я бы хотел ее отключить. Это вызывает некоторые визуальные проблемы, потому что к спискам применены анимации макета, и эти анимации воспроизводятся после того, как они были уничтожены и воссозданы. Он также показывает анимацию вступления полосы прокрутки каждый раз (когда полоса прокрутки кратко видна, чтобы указать, что прокрутка возможна), что может отвлекать, и текущая позиция прокрутки пользователя теряется в процессе.

Он также не загружает третий фрагмент до тех пор, пока не произойдет первый удар, что проблематично, поскольку каждый фрагмент обрабатывает свои собственные вызовы службы, и я предпочел бы, чтобы все три запускались одновременно, когда загружается действие. Задержка третьего сервисного вызова - это не идеал.

Есть ли способ убедить ViewPager прекратить это поведение и просто сохранить все мои фрагменты в памяти?

chefgon
источник

Ответы:

332

В 4-й редакции пакета поддержки в ViewPager был добавлен метод, который позволяет вам указать количество используемых экранных страниц, а не значение по умолчанию, равное 1.

В вашем случае вы хотите указать 2, чтобы при переходе на третью страницу первая не уничтожалась, и наоборот.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
Дэвид Снабель-Каунт
источник
Любая идея, как это сделать на обложке?
Джозефус
4
Привет. В чем я работаю, фрагменты / страницы создаются динамически, поэтому существует неограниченное количество возможных фрагментов. В этом случае обычно до 10 или меньше. Не будет ли плохое использование памяти, чтобы использовать это решение для такого количества страниц? Кстати, фрагменты будут содержать только вид. Спасибо!
Махки
Этот метод выдает: «java.lang.IllegalStateException: фрагмент уже добавлен:» ошибка для моего приложения.
alicanbatur
Большое спасибо. Это действительно сработало. У меня тоже была такая же проблема, как у @chefgon.
Прашант
@mahie вышеупомянутые решения, если для этого предлагается в качестве оптимизации. Если вы заранее знаете количество * страниц, которые вам нужно будет поддерживать или у вас есть механизмы отложенной загрузки * на ваших страницах, настройка этого параметра может иметь преимущества в воспринимаемой плавности * анимации подкачки и взаимодействия. Если у вас есть небольшое количество страниц (3-4) *, которые вы можете поддерживать активными все сразу, меньше времени будет потрачено на макет для * вновь созданных представлений поддеревьев, когда пользовательские страницы
перемещаются
8

По умолчанию ViewPager воссоздает фрагменты при перелистывании страницы. Чтобы предотвратить это, вы можете попробовать одну из двух вещей:

1. В onCreate () ваших фрагментов вызовите setRetainInstance (true).

2. Если количество фрагментов фиксировано и относительно мало, то в onCreate () добавьте следующий код:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Если я правильно помню, второй вариант более перспективный. Но я призываю вас попробовать оба и посмотреть, какие из них работают.

Панкадж Талавия
источник
3

«Установите количество страниц, которые должны быть сохранены по обе стороны от текущей страницы в иерархии представлений в состоянии ожидания. Страницы за пределами этого предела будут воссозданы из адаптера при необходимости».

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

Перси Вега
источник