Infinite ViewPager

Esto parece posible, pero estoy teniendo un pequeño problema para averiguar cómo implementar un ViewPager que puede página indefinidamente.

Mi caso de uso es para un calendario que muestra un mes a la vez, pero sería capaz de cambiar a cualquier mes paginando suficientes veces.

Actualmente estoy extending PagerAdapter , y 3 MonthViews personalizados se agregan así:

  @Override public Object instantiateItem(View collection, int position) { final MonthView mv = new MonthView(HistoryMonthActivity.this); mv.setLayoutParams(new ViewSwitcher.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT)); mv.setSelectedTime(mTime); ((DirectionalViewPager) collection).addView(mv, 0); return mv; } 

Me gustaría mantener sólo 3 MonthView s en la memoria a la vez, por lo que no hay un enorme retraso en la visualización de datos de mi base de datos en cada MonthView cuando el usuario está de tabulación. Así que cada vez que se muestre una nueva página, necesitaré quitar un MonthView y agregar un MonthView . Si alguien tiene una idea mejor para la misma funcionalidad, me encantaría escucharlo!

Estoy pensando en usar un FragmentStatePagerAdapter .

Fui capaz de implementar esto usando un poco de magia en mi MonthView , mi PagerAdapter 's OnPageChangeListener , así como con la edición del código fuente de ViewPager sí. Si alguien está interesado en cómo lo logré, echa un vistazo al código fuente o comentario con una pregunta específica.

En realidad, he estado observando las diversas maneras de hacer esta paginación "infinita", y aunque la noción humana de tiempo es que es infinita (aunque tengamos una noción de principio y fin de tiempo), las computadoras tratan En el discreto. Hay un tiempo mínimo y máximo (que se puede ajustar a medida que pasa el tiempo, recuerda la base del susto Y2K?).

De todos modos, el punto de esta discusión es que es / debe ser suficiente para soportar un intervalo de fecha relativamente infinito a través de un rango de fechas realmente finito. Un gran ejemplo de esto es la implementación de CalendarView Android framework y el WeeksAdapter dentro de ella. La fecha mínima predeterminada es en 1900 y la fecha máxima predeterminada es en 2100, esto debería cubrir el 99% del uso del calendario de cualquier persona dentro de un radio de 10 años alrededor de hoy fácilmente.

Lo que hacen en su implementación (centrada en semanas) es computar el número de semanas entre la fecha mínima y la fecha máxima. Esto se convierte en el número de páginas en el buscapersonas. Recuerde que el buscapersonas no necesita mantener todas estas páginas simultáneamente ( setOffscreenPageLimit(int) ), sólo tiene que ser capaz de crear la página basada en el número de página (o índice / posición). En este caso el índice es el número de semanas que la semana es desde la fecha mínima. Con este enfoque sólo tiene que mantener la fecha mínima y el número de páginas (distancia a la fecha máxima), luego para cualquier página que pueda calcular fácilmente la semana asociada con esa página. No bailar en torno al hecho de que ViewPager no soporta bucle (aka paginación infinita), y tratando de forzar a comportarse como puede desplazarse infinitamente.

 new FragmentStatePagerAdapter(getFragmentManager()) { @Override public Fragment getItem(int index) { final Bundle arguments = new Bundle(getArguments()); final Calendar temp_calendar = Calendar.getInstance(); temp_calendar.setTimeInMillis(_minimum_date.getTimeInMillis()); temp_calendar.setFirstDayOfWeek(_calendar.getStartOfWeek()); temp_calendar.add(Calendar.WEEK_OF_YEAR, index); // Moves to the first day of this week temp_calendar.add(Calendar.DAY_OF_YEAR, -UiUtils.modulus(temp_calendar.get(Calendar.DAY_OF_WEEK) - temp_calendar.getFirstDayOfWeek(), 7)); arguments.putLong(KEY_DATE, temp_calendar.getTimeInMillis()); return Fragment.instantiate(getActivity(), WeekDaysFragment.class.getName(), arguments); } @Override public int getCount() { return _total_number_of_weeks; } }; 

Entonces WeekDaysFragment puede mostrar fácilmente la semana comenzando en la fecha pasada en sus argumentos.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.