ViewPager.setOffscreenPageLimit (0) no funciona como se esperaba

Los fragmentos que uso en mi instancia de ViewPager muchos recursos, así que solo me gustaría cargar uno a la vez. Cuando bash lo siguiente:

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

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

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

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

¿Necesita ViewPager un mínimo de 1 páginas fuera de 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 forma que encontré fue setUserVisibleHint
agrega esto a tu fragmento

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

Primero Agregar

  boolean isFragmentLoaded = false; 

que

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

Puedes intentarlo así:

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

ViewPager se carga de forma predeterminada para cargar la página siguiente (Fragmento) que no puede cambiar mediante setOffscreenPageLimit (0). Pero puedes hacer algo para hackear. Puede implementar la función OnPageSelected en Activity que contiene ViewPager. En el siguiente Fragmento (que no desea cargar), escribe una función, digamos showViewContent () donde pone todo el código init que consume recursos y no hace nada antes del método onResume (). A continuación, llame a la función showViewContent () en onPageSelected. Espero que esto ayude

para la función “instantiateItem”, solo prepare el fragmento, pero no cargue el contenido pesado.

Use “onPageChangeListener” para que cada vez que vaya a una página específica, cargue su contenido pesado y lo muestre.

esto puede ser viejo pero esto parece funcionar para mí. Anular esta función:

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

codificaciones felices …

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

El mínimo int para mViewPager.setOffscreenPageLimit (…); es 1, por lo que incluso si lo cambia a 0, aún tendrá 2 páginas cargadas.

Lo primero que hay que hacer es crear una int estática llamaremos a maxPageCount y reemplazaremos el método getCount () de FragmentStatePagerAdapter para devolver maxPageCount:

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

Cree entonces un método estático accesible desde cualquier lugar del progtwig que le permita cambiar este maxCount:

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

Ahora inicialice maxPageCount en 1. Cuando lo desee, puede agregar otra página. En mi caso, cuando necesitaba que el usuario tratara la página actual antes que la otra generada. Él lo hace y luego, sin problemas puede pasar a la siguiente página.

Espero que ayude a alguien.

Use This // create boolean para recuperar datos private boolean isViewShown = false;

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getView() != null) { isViewShown = true; // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data fetchData(); } else { isViewShown = false; } }