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?
- Amazon AWS tutoriales?
- Android KeyPairGenerator genera siempre el mismo par de claves
- Java Runtime.getRuntime (). Exec () falla después de llamarla varios cientos de veces
- División de la cadena con RegEx en Android
- Cortar contenido en TextView
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(); } } }
- Android: Poner cuadrícula de objetos dinámicos y personalizados dentro de otra cuadrícula de objetos dinámicos y personalizados
- API de Google Fit, obteniendo calorías por actividad
- SMS raw pdu en Android
- Java.lang.OutOfMemoryError al intentar cargar un mapa de bits en imageView
- Compatible con aplicaciones no Ice Cream Sandwich
- Serialización Gson dependiendo del valor del campo
- ¿Es posible realizar llamadas de OpenGL ES desde su código C ++ y Java?
- Android Phonegap 2.1> 2.2 Error de actualización
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!
- Interpretar entrada de Logcat: threadid = 8: suspendido después de deshacer (sc = 1 dc = 1 s = Y)
- Mostrar diálogo fuera de la actividad