Бесконечный ViewPager

Это кажется возможным, но у меня есть небольшая проблема, ViewPager тем, как реализовать ViewPager который может неограниченно отображаться.

Мой вариант использования – для календаря, который показывает месяц за раз, но мог бы переключиться на любой месяц, выполнив пейджинг достаточно времени.

В настоящее время я просто extending PagerAdapter , и добавляются 3 пользовательских MonthViews :

  @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; } 

Я хотел бы хранить только 3 MonthView в памяти за раз, так что не существует огромной задержки в отображении данных из моей базы данных в каждом MonthView когда пользователь табуляции. Поэтому каждый раз, когда отображается новая страница, мне нужно будет удалить один MonthView и добавить один MonthView . Если у кого-то есть лучшая идея для той же функциональности, я бы хотел это услышать!

Я думаю о попытке использовать FragmentStatePagerAdapter .

Solutions Collecting From Web of "Бесконечный ViewPager"

Я смог реализовать это, используя небольшую магию в своем MonthView , моем PagerAdapter моего OnPageChangeListener , а также с редактированием исходного кода самого ViewPager . Если кто-то заинтересован в том, как я его достиг, проверьте исходный код или комментарий с конкретным вопросом.

Фактически, я смотрел на различные способы сделать это «бесконечное» разбиение на страницы, и хотя человеческое понятие времени состоит в том, что оно бесконечно (хотя у нас есть понятие начала и конца времени), компьютеры В дискретном. Существует минимальное и максимальное время (которое может быть скорректировано с течением времени, помните, основываясь на страхе Y2K?).

В любом случае, точка этого обсуждения состоит в том, что он / должен быть достаточным для поддержки относительно бесконечного диапазона дат с помощью фактически конечного диапазона дат. WeeksAdapter примером этого является реализация CalendarView платформы Android и WeeksAdapter внутри нее. Минимальная дата по умолчанию – 1900, а максимальная дата по умолчанию – 2100, это должно охватывать 99% использования календаря любого человека в радиусе 10 лет вокруг сегодня.

То, что они делают в своей реализации (ориентировано на недели), вычисляет количество недель между минимальной и максимальной датой. Это становится числом страниц в пейджере. Помните, что пейджер не должен поддерживать все эти страницы одновременно ( setOffscreenPageLimit(int) ), он просто должен иметь возможность создавать страницу на основе номера страницы (или индекса / позиции). В этом случае индекс – это количество недель, прошедших с минимальной даты. При таком подходе вам просто нужно сохранить минимальную дату и количество страниц (расстояние до максимальной даты), а затем для любой страницы вы можете легко вычислить неделю, связанную с этой страницей. Не ViewPager танцевать вокруг того, что 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 может легко отображать неделю, начиная с даты, переданной в ее аргументах.