ViewPager.setOffscreenPageLimit (0) no funciona como se esperaba

Los fragmentos que utilizo en mi instancia de ViewPager son muy intensivos en recursos, por lo que sólo me gustaría cargar uno a la vez. Cuando intento lo siguiente:

 mViewPager.setOffscreenPageLimit(0); mViewPager.setAdapter(mPagerAdapter); 

Mi función de anulación FragmentStatePagerAdapter.getItem(int position) se llama 3 veces, que es lo que sucede cuando llamo a mViewPager.setOffscreenPageLimit(1) . Esperaría que sólo se llama una vez, porque he especificado 0 páginas fuera de pantalla.

Creo que estoy llamando todo correctamente, porque si llamo mViewPager.setOffscreenPageLimit(2) , FragmentStatePagerAdapter.getItem(int position) se llama 5 veces como yo esperaría.

¿ViewPager requiere un mínimo de 1 páginas fuera de pantalla, o estoy haciendo algo mal aquí?

ViewPager requiere un mínimo de 1 páginas sin pantalla

Sí. Si estoy leyendo el código fuente correctamente, debería recibir una advertencia sobre esto en LogCat, algo así como:

 Requested offscreen page limit 0 too small; defaulting to 1 

La mejor manera que encontré fue setUserVisibleHint
Agregue esto a su fragmento

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

Primero agregue

  boolean _areLecturesLoaded = false; 

que

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

Puede probar de esta manera:

 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(){} 

La solución alternativa es utilizar 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 es la opción por defecto para cargar la siguiente página (Fragmento) que no puede cambiar por setOffscreenPageLimit (0). Pero puedes hacer algo para hackear. Puede implementar la función onPageSelected en Activity que contiene el ViewPager. En el fragmento siguiente (que no quieres cargar), escribes una función, digamos showViewContent (), donde se pone todo el código init que consuma recursos y no hace nada antes del método onResume (). A continuación, llame a la función showViewContent () dentro de onPageSelected. Espero que esto ayude.

Para la función "instantiateItem", sólo prepare el fragmento, pero no cargue el contenido pesado.

Utilice "onPageChangeListener", para que cada vez que vaya a una página específica, cargue su contenido pesado y muéstrelo.

Esto puede ser hilo viejo, pero esto parece funcionar para mí. Anule esta función:

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

Feliz codificación …

Tengo el mismo problema. Encontré algún código útil en este sitio y lo transformé.

El int min para mViewPager.setOffscreenPageLimit (…); Es 1, por lo que incluso si lo cambia a 0 todavía tendrá 2 páginas cargadas.

Lo primero que debemos hacer es crear un int estático que llamaremos maxPageCount y anularemos el método FragmentStatePagerAdapter getCount () para devolver maxPageCount:

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

Crear entonces un método estático accesible desde cualquier lugar del programa que le permitirá cambiar este maxCount:

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

Ahora inicie maxPageCount en 1. Cuando quiera, puede agregar otra página. En mi caso cuando necesitaba que el usuario tratara la página actual primero antes de generar la otra. Lo hace y luego, sin problema puede pasar a la siguiente página.

Espero que ayude a alguien.

  • Desplazamiento horizontal y vertical en la vista del reciclador android
  • Problema de envoltura de contenido de Indicador TabPage de Android
  • Android View Pager se equivoca
  • TabLayout y ViewPager -Tabs no funcionan después de pasar entre los elementos de cajones deslizantes
  • Los Fragmentos de ViewPager desaparecen
  • Mostrando imágenes con efecto carrusel en android
  • Implicado Z-Ordenando Para ViewPagers
  • Emita el desplazamiento WebView en NestedScrollView Android 2.3 o menos
  • ¿Cómo puedo implementar la vista de cabecera + deslizar la pestaña del buscapersonas + ver paginador como la aplicación de lujo?
  • Cambio de la pestaña Default en la pestaña de la página del cajón de navegación
  • Cómo almacenar cada posición de la página viewpager en la lista de ellos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.