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.
- Vinculación de datos de observador de eventos de Android para ViewPager
- Barra de herramientas y TabLayout no son visibles en dispositivos Android 4.4
- Implemente el cajón deslizante con el visor donde se encuentra el cajón deslizante en el visor
- Fragmento de actualización de ViewPager en el dispositivo
- Android - ViewPager Adapter, establece el elemento principal antes de que el adaptador se instancia
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í?
- ¿Cómo implementar el botón en ViewPager?
- Settext cuestión en ViewPager versión particular - 5.1.1 android?
- Android PagerTabStrip - Eliminar espaciado
- Android - ¿Cómo puedo localizar el indicador de pestañas entre las dos pestañas TextViews?
- No se puede emitir a la clase ViewPager personalizada
- ¿Existe una manera de crear un control deslizante de vista previa en android
- Tutorial para implementar el uso de TabHost en Android 2.2 + ViewPager y Fragmentos
- Android View onSaveInstanceState no se llama
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.