Фрагменты, которые я использую в своем ViewPager
экземпляре, довольно ресурсоемкие, поэтому я хотел бы загружать только по одному. Когда я пробую следующее:
mViewPager.setOffscreenPageLimit(0);
mViewPager.setAdapter(mPagerAdapter);
Моя FragmentStatePagerAdapter.getItem(int position)
функция переопределения вызывается 3 раза, что происходит, когда я вызываюmViewPager.setOffscreenPageLimit(1)
. Я ожидал, что он будет вызван только один раз, потому что я указал 0 внеэкранных страниц.
Я считаю, что все называю правильно, потому что если я позвоню mViewPager.setOffscreenPageLimit(2)
,FragmentStatePagerAdapter.getItem(int position)
5 раз, как я ожидал.
Требуется ли ViewPager минимум 1 закадровая страница, или я здесь что-то делаю не так?
android
android-viewpager
android-support-library
Крис Лейси
источник
источник
ViewPager.setOffscreenPageLimit(2)
у меня работала. ПопробуйтеViewPager.setOffscreenPageLimit(totTabs - 1)
Ответы:
Да. Если я правильно читаю исходный код, вы должны получить предупреждение об этом в LogCat, например:
источник
ViewPager
.ViewPager
создает эти фрагменты, чтобы представления существовали, чтобы пользователь мог перемещаться между ними, с анимированным эффектом, показывающим, что старый вид скользит с экрана, а новый вид скользит по экрану. Вы можете попробовать написать свой собственный,ViewPager
который может пролистывать несуществующие вещи. Вы можете узнать больше об этом на code.google.com/p/android/issues/detail?id=56667#c3setOffscreenPageLimit(0)
получить 0. Тогда я сам смогу справиться с последствиями. Пустой фрагмент по умолчанию может быть заполнителем, например, до тех пор, пока не загрузится один фрагмент. Все это может происходить вне потока пользовательского интерфейса. Во всяком случае, я об этом особо не думал.ViewPager
, который вы заменяете реальным содержимым, когда он доступен .Лучший способ, который я нашел, - это setUserVisibleHint
добавить это в свой фрагмент
источник
Вы можете попробовать вот так:
источник
Первое добавление
чем
источник
ViewPager по умолчанию загружает следующую страницу (фрагмент), которую нельзя изменить с помощью setOffscreenPageLimit (0). Но можно что-нибудь взломать. Вы можете реализовать функцию onPageSelected в Activity, содержащем ViewPager. В следующем фрагменте (который вы не хотите загружать) вы пишете функцию, скажем, showViewContent (), куда вы помещаете весь ресурсоемкий код инициализации и ничего не делаете перед методом onResume (). Затем вызовите функцию showViewContent () внутри onPageSelected. Надеюсь, это поможет.
источник
это может быть старый поток, но, похоже, это работает для меня. Переопределите эту функцию:
счастливые кодировки ...
источник
в моем случае я хотел запустить некоторые анимации в представлениях, но с setUserVisibleHint возникли некоторые проблемы ...
мое решение:
1 / addOnPageChangeListener для вашего адаптера:
2 / реализовать OnPageChangeListener:
3 / переопределить 3 метода:
4 / объявить и инициализировать эту переменную в вашем классе
Примечание : у меня есть три фрагмента в моем адаптере, и я использую mTabState для setCurrentItem и текущей позиции адаптера, которые распознают, какой фрагмент отображается пользователю во времени ... 5 / в методе onPageSelected добавьте эти коды:
если предыдущая страница или текущая страница - страница 0 (фрагмент в позиции 0), то сделайте это
6 / теперь в вашем классе фрагмента (фрагмент в позиции 0 адаптера) вы должны создать широковещательный приемник и зарегистрировать его в методе onResume и отменить регистрацию в методах onPause:
Резюме: у меня есть Fragment Pager Adapter, который показывает в нем три фрагмента, я хочу показать некоторые анимации в представлениях во фрагменте в позиции 0 адаптера, для этого я использую BroadcastReceiver. Когда фрагмент выбран, я запускаю метод анимации и показываю представления пользователю, когда фрагмент не отображается пользователю, я пытаюсь использовать невидимые представления ...
источник
Попробуйте этот код, чтобы решить проблему с обновлением представления в Viewpager ....
источник
для функции instantiateItem просто подготовьте фрагмент, но не загружайте тяжелый контент.
Используйте onPageChangeListener, чтобы каждый раз, когда вы переходите на определенную страницу, вы загружали ее тяжелый контент и отображали его.
источник
У меня вроде такая же проблема. Я нашел на этом сайте полезный код и преобразовал его.
Мин. Интервал для mViewPager.setOffscreenPageLimit (...); равно 1, поэтому даже если вы измените его на 0, у вас все равно будут загружены 2 страницы.
Первое, что нужно сделать, это создать статический int, который мы вызовем maxPageCount и переопределим метод getCount () FragmentStatePagerAdapter, чтобы вернуть maxPageCount:
Затем создайте статический метод, доступный из любого места в программе, который позволит вам изменить этот maxCount:
Теперь инициализируйте maxPageCount равным 1. Когда захотите, вы можете добавить еще одну страницу. В моем случае, когда мне нужно, чтобы пользователь сначала обработал текущую страницу, прежде чем сгенерировать другую. Он это делает, а затем без проблем может перелистнуть на следующую страницу.
Надеюсь, это кому-то поможет.
источник
Use This // создать логическое значение для выборки данных private boolean isViewShown = false;
источник