Бесконечный ViewPager - PullRequest
       6

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

19 голосов
/ 16 сентября 2011

Это кажется возможным, но у меня есть небольшая проблема с выяснением, как реализовать 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;
    }

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

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

Ответы [ 2 ]

8 голосов
/ 18 сентября 2011

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

6 голосов
/ 27 декабря 2012

На самом деле, я искал различные способы сделать эту «бесконечную» нумерацию страниц, и хотя человеческое представление о времени таково, что оно бесконечно (хотя у нас есть представление о начале и конце времени) , компьютеры разбираются в дискретном. Существует минимальное и максимальное время (которое может быть скорректировано с течением времени, помните основание напуга 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 может легко отобразить неделю, начиная с даты, переданной в его аргументах.

...