На самом деле, я искал различные способы сделать эту «бесконечную» нумерацию страниц, и хотя человеческое представление о времени таково, что оно бесконечно (хотя у нас есть представление о начале и конце времени) , компьютеры разбираются в дискретном. Существует минимальное и максимальное время (которое может быть скорректировано с течением времени, помните основание напуга Y2K?).
В любом случае, смысл этого обсуждения в том, что этого достаточно / должно быть достаточно для поддержки относительно бесконечного диапазона дат через фактически конечный диапазон дат. Прекрасным примером этого является реализация CalendarView
платформы Android и WeeksAdapter
внутри нее. Минимальная дата по умолчанию - 1900, а максимальная дата по умолчанию - 2100, это должно охватывать 99% календарного использования любого человека в радиусе 10 лет вокруг сегодняшнего дня.
Что они делают в своей реализации (ориентированы на недели), так это вычисляют количество недель между минимальной и максимальной датой. Это становится количеством страниц в пейджере. Помните, что пейджер не должен поддерживать все эти страницы одновременно (setOffscreenPageLimit(int)
), он просто должен иметь возможность создавать страницу на основе номера страницы (или индекса / позиции). В этом случае индекс - это количество недель, от которых неделя начинается с минимальной даты. При таком подходе вам просто нужно поддерживать минимальную дату и количество страниц (расстояние до максимальной даты), тогда для любой страницы вы можете легко вычислить неделю, связанную с этой страницей. Не нужно танцевать вокруг того факта, что ViewPager
не поддерживает циклическое воспроизведение (например, бесконечную нумерацию страниц) и пытается заставить его вести себя так, как будто оно может бесконечно прокручиваться.
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;
}
};
Тогда WeekDaysFragment
может легко отобразить неделю, начиная с даты, переданной в его аргументах.