android - ViewPager infinito
android-viewpager infinite-scroll (2)
En realidad, he estado buscando varias maneras de hacer esta paginación "infinita", y aunque la noción humana del tiempo es que es infinita (aunque tenemos una noción del principio y el fin del tiempo), las computadoras tratan En lo discreto. Hay un tiempo mínimo y máximo (que puede ajustarse a medida que pasa el tiempo, ¿recuerda la base del susto Y2K?).
De todos modos, el punto de esta discusión es que es / debería ser suficiente para admitir un intervalo de fechas relativamente infinito a través de un intervalo de fechas realmente finito. Un gran ejemplo de esto es la implementación CalendarView
del marco de Android y el WeeksAdapter
dentro de él. La fecha mínima predeterminada es 1900 y la fecha máxima predeterminada es 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 (enfocada en semanas) es calcular el número de semanas entre la fecha mínima y la máxima. Esto se convierte en el número de páginas en el paginador. Recuerde que el paginador no necesita mantener todas estas páginas simultáneamente ( setOffscreenPageLimit(int)
), solo necesita poder crear la página según 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, solo 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, puede calcular fácilmente la semana asociada con esa página. No ViewPager
alrededor del hecho de que ViewPager
no admite bucles (también conocido como paginación infinita), y tratar de forzarlo a comportarse como si pudiera 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;
}
};
Luego, WeekDaysFragment
puede mostrar fácilmente la semana que comienza en la fecha que se pasa en sus argumentos.
Esto parece posible, pero me cuesta un poco descubrir cómo implementar un ViewPager
que pueda ViewPager
tiempo indefinido.
Mi caso de uso es para un calendario que muestra un mes a la vez, pero podría cambiar a cualquier mes paginando las veces suficientes.
Actualmente solo estoy extending PagerAdapter
, y se agregan 3 MonthViews
personalizadas como:
@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 tener solo 3 MonthView
s en la memoria a la vez, para que no haya una gran demora en mostrar los datos de mi base de datos en cada MonthView
cuando el usuario está haciendo tabulaciones. Así que cada vez que se muestre una nueva página, tendré que eliminar un MonthView
y agregar un MonthView
. Si alguien tiene una mejor idea para la misma funcionalidad, ¡me encantaría escucharla!
Estoy pensando en tratar de usar un FragmentStatePagerAdapter
.
Pude implementar esto usando un poco de magia en mis MonthView
s, PagerAdapter
mi OnPageChangeListener
, así como con la edición del código fuente de ViewPager
. Si alguien está interesado en cómo lo logré, revise el código fuente o comente con una pregunta específica.