Запретить ViewPager уничтожать заставку

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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