Intereting Posts
Не удалось разрешить com.android.tools.build:gradle:0.5.+ Android – найти сервер в сети Почему в магазине Google Play говорится, что мое приложение для Android несовместимо с моим собственным устройством? Как использовать adb grant или adb revoke? Исключение – не удалось разрешить атрибут по индексу 6: TypedValue Как анализировать память с помощью студии Android Как я могу отключить весь эффект прокрутки в моем приложении? Можно ли настроить пользовательские заголовки HTTP в WebView Почему всплывающие сообщения Android называются тостами? Как создать ссылки на ссылку для классов Android в javadoc? Как определить, было ли отклонено уведомление? Внедрить безопасность на уровне подписки на услуги Android с более чем одной разрешенной подписью Лучший вариант дизайна базы данных для Android-приложения с огромными данными Исходный код Android и репо – что именно происходит при получении кода Можно ли отображать встроенные изображения из html в Android TextView?

ViewPager.setOffscreenPageLimit (0) не работает должным образом

Фрагменты, которые я использую в моем экземпляре 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 внеэкранных страниц, или я делаю что-то неправильно здесь?

Solutions Collecting From Web of "ViewPager.setOffscreenPageLimit (0) не работает должным образом"

Требует ли ViewPager минимум 1 внеэкранных страниц

Да. Если я правильно читаю исходный код, вы должны получить предупреждение об этом в LogCat, например:

 Requested offscreen page limit 0 too small; defaulting to 1 

Лучший способ, который я нашел, – setUserVisibleHint
Добавьте это в свой фрагмент

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // load data here }else{ // fragment is no longer visible } } 

Первое добавление

  boolean _areLecturesLoaded = false; 

чем

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && !_areLecturesLoaded) { //Load Your Data Here like.... new GetContacts().execute(); _areLecturesLoaded = true; } else{ } } 

Вы можете попробовать следующее:

 public abstract class LazyFragment extends Fragment { protected boolean isVisible; /** * 在这里实现Fragment数据的缓加载. * @param isVisibleToUser */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } protected void onVisible(){ lazyLoad(); } protected abstract void lazyLoad(); protected void onInvisible(){} 

Альтернативным решением является использование FragmentStatePagerAdapter

 public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return ArrayListFragment.newInstance(position); } } 

ViewPager по умолчанию загружает следующую страницу (фрагмент), которую вы не можете изменить с помощью setOffscreenPageLimit (0). Но вы можете что-то сделать, чтобы взломать. Вы можете реализовать функцию onPageSelected в Activity, содержащей ViewPager. В следующем фрагменте (который вы не хотите загружать) вы пишете функцию, например, showViewContent (), где вы вставляете весь код инициализации ресурсов и ничего не делаете перед методом onResume (). Затем вызовите функцию showViewContent () внутри onPageSelected. Надеюсь, это поможет.

Для функции «instantiateItem» просто подготовьте фрагмент, но не загружайте тяжелый контент.

Используйте «onPageChangeListener», чтобы каждый раз, когда вы переходите на определенную страницу, вы загружаете ее тяжелый контент и показываете его.

Это может быть старый поток, но это, похоже, работает для меня. Переопределите эту функцию:

 @Override public void setMenuVisibility(boolean menuVisible) { super.setMenuVisibility(menuVisible); if ( menuVisible ) { /** * Load your stuffs here. */ } else { /** * Fragment not currently Visible. */ } } 

Счастливые кодировки …

У меня такая же проблема. Я нашел полезный код на этом сайте и преобразовал его.

Min int для mViewPager.setOffscreenPageLimit (…); Равно 1, поэтому, даже если вы измените его на 0, вы все равно загрузите 2 страницы.

Первое, что нужно сделать, это создать статический int, который мы назовем maxPageCount и переопределим метод FragmentStatePagerAdapter getCount (), чтобы вернуть maxPageCount:

  @Override public int getCount() { return maxPageCount; } 

Создайте статический метод, доступный из любого места в программе, которое позволит вам изменить этот maxCount:

 public static void addPage(){ maxPageCount++; //or maxPageCount = fragmentPosition+2 mFragmentStatePagerAdapter.notifyDataSetChanged(); //notifyDataSetChanged is important here. } 

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

Надеюсь, это поможет кому-то.