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.
- Problema de desplazamiento Infinito Infinito de RecyclerView
- Infinite Scrolling Image ViewPager
- Añadir elementos a Endless Scroll RecyclerView con ProgressBar en la parte inferior
- Cambiar ViewPager para habilitar el desplazamiento de páginas infinito
- RecyclerView ScrollListener dentro de NestedScrollView
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
.
- Agregar la barra de progreso en la parte inferior de una vista de lista
- Creación de una vista en forma de calendario con desplazamiento infinito en Android
- ViewPager.setCurrentItem sólo funciona con smoothScroll establecido en true
- Lista de desplazamiento infinito de Android en ambas direcciones
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.