ViewPager.setOffscreenPageLimit (0) no tiene ningún efecto en absoluto. ¿Cómo puedo cargar una página a la vez en un ViewPager?

Incluso cuando configuro oViewPager.setOffscreenPageLimit (0) mi paginador de vista todavía carga 1 página fuera de pantalla en cada lado de la página visible.

¿Cómo puedo hacer que sólo cargue la página cuando el usuario se deslice a ella?

Mi adaptador si ayuda:

public class MainPagerAdapter extends FragmentPagerAdapter { protected static final String[] CONTENT = new String[] { "page 1", "page 2", "page 3", "page 4", }; private int mCount = CONTENT.length; public MainPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { //return TestFragment.newInstance(CONTENT[position % CONTENT.length]); return MainFragment.newInstance(position); } @Override public int getCount() { return mCount; } @Override public CharSequence getPageTitle(int position) { return MainPagerAdapter.CONTENT[position % CONTENT.length]; } public void setCount(int count) { if (count > 0 && count <= 10) { mCount = count; notifyDataSetChanged(); } } } 

Otra alternativa es usar un OnPageChangeListener , y cada vez que se produce un cambio de página, llama a un método de actualización en tus fragmentos.

Esto requerirá que establezca un OffScreenPageLimit más OffScreenPageLimit , pero los fragmentos se actualizarán cada vez que uno se ponga en la vista.

 pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position){ ((MyRefreshableFragment)pager.getAdapter().getItem(position)).refresh(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageScrollStateChanged(int arg0) {} }); 

¿Cómo puedo hacer que sólo cargue la página cuando el usuario se deslice a ella?

Escriba su propio ViewPager . Como se observa por la respuesta de Jani, ViewPager tiene un límite de página fuera de pantalla mínimo de 1 a cada lado.

Esto es necesario para que la animación de swiping funcione sin problemas. De lo contrario, si tuviéramos que esperar a configurar la interfaz de usuario para la siguiente página, el borrado del usuario se congelaría, o se deslizaría a contenido en blanco, por el tiempo que tardara en obtener esa interfaz de usuario establecida.

No puedes hacer esto. Obtendrá un error como: "Límite de página fuera de pantalla requerido 0 demasiado pequeño, predeterminado a 1". Pero aquí puede encontrar más información sobre ello: ViewPager.setOffscreenPageLimit (0) no funciona como se esperaba

Utilizo un cargador e init los cargadores de cada fragmento en el onPageSelected .

Hay el código fuente

  /** * Set the number of pages that should be retained to either side of the * current page in the view hierarchy in an idle state. Pages beyond this * limit will be recreated from the adapter when needed. * * <p>This is offered as an optimization. If you know in advance the number * of pages you will need to support or have lazy-loading mechanisms in place * on your pages, tweaking this setting can have benefits in perceived smoothness * of paging animations and interaction. If you have a small number of pages (3-4) * that you can keep active all at once, less time will be spent in layout for * newly created view subtrees as the user pages back and forth.</p> * * <p>You should keep this limit low, especially if your pages have complex layouts. * This setting defaults to 1.</p> * * @param limit How many pages will be kept offscreen in an idle state. */ public void setOffscreenPageLimit(int limit) { if (limit < DEFAULT_OFFSCREEN_PAGES) {//DEFAULT_OFFSCREEN_PAGES = 1 Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } } 

Puede personalizar su viewpager copiando el origen del viewpager, luego cambie este método

Me gusta esto

 public class LazyViewPager extends ViewGroup { private static final String TAG = "LazyViewPager"; private static final boolean DEBUG = false; private static final boolean USE_CACHE = false; private static final int DEFAULT_OFFSCREEN_PAGES = 0;//change default to load one page,no offset,ViewPager is 1,so cache 2 Fragment private static final int MAX_SETTLE_DURATION = 600; // ms 

Sé que esta es una respuesta muy tarde, pero por el amor de Dios no tienes que escribir tu propio viewpager como alguien sugirió.

Vamos a tomar las cosas desde el principio:

Cómo funciona el viewpager:

Por defecto mantiene un elemento en la memoria de cada lado por lo que no tiene que crearlo cada vez.

Primera solución:

 mViewPager.setOffscreenPageLimit(0); 

Lo que resulta en:

Límite de página fuera de pantalla requerido 0 demasiado pequeño; Predeterminado a 1

2ª Solución:

Desea actualizar el Fragmento cuando es realmente visible para el usuario así que use el método:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { //Do something like //adapter.notifyDataSetChanged(); } } 

Espero que ayude a alguien en el futuro!

  • Preferencias de listas de Android: ¿tiene un resumen como valor seleccionado?
  • Tools.jar no se encuentra OS X
  • Cómo convertir de java.util.HashMap a android.content.ContentValues?
  • ¿Cómo alineo estos números en el decimal en android?
  • Aplicación para Android: ¿Llamar a AsyncTask dos veces?
  • TabWidget envuelto en HorizontalScrollView no se desplaza con ViewPager
  • Android incompatibles tipos de estudio necesarios java.lang.String encontrado java.lang.String
  • Programe PPTP / L2TP VPN de forma programática en Android
  • GridView OnItemClickListener no está llamando a onItemClick
  • NullPointerException: name == null
  • Códigos de ejemplo para Android Programación Bluetooth
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.