На самом деле, я искал различные способы сделать эту «бесконечную» нумерацию страниц, и хотя человеческое представление о времени таково, что оно бесконечно (хотя у нас есть представление о начале и конце времени), компьютеры разбираются в дискретном.Существует минимальное и максимальное время (которое может быть скорректировано с течением времени, помните основание напуга 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
может легко отобразитьнеделю, начинающуюся с даты, указанной в аргументах.
В качестве альтернативы, кажется, что в некоторой версии приложения Календарь на Android используется ViewSwitcher
(что означает, что есть только 2 страницы: ту, которую вы видите, и скрытую страницу).Затем он изменяет анимацию перехода в зависимости от того, как пользователь провел пальцем, и соответственно отображает следующую / предыдущую страницу.Таким образом, вы получаете бесконечное разбиение на страницы, потому что оно просто переключается между двумя страницами бесконечно.Это требует использования View
для страницы, хотя я и пошел с первым подходом.
В общем, если вы хотите "бесконечную нумерацию страниц", это, вероятно, потому что ваши страницы основаны на датах илираз как-то.Если это так, рассмотрите возможность использования конечного подмножества времени, которое относительно бесконечно.Вот как CalendarView
реализован, например.Или вы можете использовать ViewSwitcher
подход.Преимущество этих двух подходов состоит в том, что ни один из них не делает ничего особенно необычного с ViewSwitcher
или ViewPager
, и не требует никаких уловок или переопределений, чтобы заставить их вести себя бесконечно (ViewSwitcher
уже предназначен для бесконечного переключения между представлениями)., но ViewPager
предназначен для работы на конечном, но не обязательно постоянном наборе страниц).