package com.prolificinteractive.materialcalendarview; import android.support.annotation.NonNull; import android.support.v4.util.SparseArrayCompat; /** * Pager adapter backing the calendar view */ class MonthPagerAdapter extends CalendarPagerAdapter<MonthView> { MonthPagerAdapter(MaterialCalendarView mcv) { super(mcv); } @Override protected MonthView createView(int position) { return new MonthView(mcv, getItem(position), mcv.getFirstDayOfWeek()); } @Override protected int indexOf(MonthView view) { CalendarDay month = view.getMonth(); return getRangeIndex().indexOf(month); } @Override protected boolean isInstanceOfView(Object object) { return object instanceof MonthView; } @Override protected DateRangeIndex createRangeIndex(CalendarDay min, CalendarDay max) { return new Monthly(min, max); } public static class Monthly implements DateRangeIndex { private final CalendarDay min; private final int count; private SparseArrayCompat<CalendarDay> dayCache = new SparseArrayCompat<>(); public Monthly(@NonNull CalendarDay min, @NonNull CalendarDay max) { this.min = CalendarDay.from(min.getYear(), min.getMonth(), 1); max = CalendarDay.from(max.getYear(), max.getMonth(), 1); this.count = indexOf(max) + 1; } public int getCount() { return count; } public int indexOf(CalendarDay day) { int yDiff = day.getYear() - min.getYear(); int mDiff = day.getMonth() - min.getMonth(); return (yDiff * 12) + mDiff; } public CalendarDay getItem(int position) { CalendarDay re = dayCache.get(position); if (re != null) { return re; } int numY = position / 12; int numM = position % 12; int year = min.getYear() + numY; int month = min.getMonth() + numM; if (month >= 12) { year += 1; month -= 12; } re = CalendarDay.from(year, month, 1); dayCache.put(position, re); return re; } } }