我正在为我的Android应用构建一个自定义日历视图,允许您在几个月之间滑动。我已经创建了自定义日历方块视图,我已将其嵌入到自定义日历月视图中,并且所有内容都在1个月的范围内完美运行。
不幸的是,现在我被卡住了。我现在想将自定义日历月视图嵌入到无限视图寻呼机中,这样我就可以无限期地向前和向后滚动日历。
我尝试使用简单的技巧调整this horizontal pager以进行无限滚动。我保存了一个包含3个日历月视图的数组,并根据用户滚动到的位置更新列表。实施例...
但是,当我这样做的时候,刷到下个月时屏幕上会有明显的闪光。
这是向前滚动的代码(注意:向后滚动具有相同的问题)
private void updateViewsForForwardScroll() {
// Note: INDEX_PREV = 0; INDEX_CURR = 1; INDEX_NEXT = 2
((CalendarMonthView) getChildAt(INDEX_PREV)).showMonth(oneMonthPriorTo(currentMonth));
((CalendarMonthView) getChildAt(INDEX_CURR)).showMonth(currentMonth);
setCurrentScreen(INDEX_CURR, false);
((CalendarMonthView) getChildAt(INDEX_NEXT)).showMonth(oneMonthAfter(currentMonth));
}
我认为问题是setCurrentScreen()在showMonth(currentMonth)之前完成,因此INDEX_CURR中的视图在设置屏幕时仍在更新。我尝试使用以下策略来解决这个问题......
我根本没有触及目前专注的视图,但仍然有一个闪光!这一次,屏幕从9月到8月闪烁,然后又回到9月。
所以我做错了什么?如果没有用户知道,有没有办法做我想做的事情?如果没有,我可以利用现有的课程吗?
(作为一个附带问题,有什么方法可以直观地自定义Android CalendarView吗?这样可以解决我所有的问题......)
提前致谢!
答案 0 :(得分:1)
我最终通过扩展FragmentStatePagerAdapter
以及整合user113215的建议来实现它。我没有真正无限滚动,而是几乎无限(即10,000个月,或833年)。这是我的大部分代码:
public static class CalendarAdapter extends FragmentStatePagerAdapter {
private static final int NUM_MONTHS = 10000;
private static final int INDEX_EPOCH = NUM_MONTHS/2;
private static final int MONTHS_PER_YEAR = 12;
private static final Calendar calendarMonthEpoch = new GregorianCalendar(2012, Calendar.AUGUST, 1);
// ...
@Override
public int getCount() {
return NUM_MONTHS;
}
@Override
public Fragment getItem(int position) {
return CalendarMonthFragment.newInstance(calendarMonthAtPosition(position));
}
private static Calendar calendarMonthAtPosition(int position) {
int offset = position - INDEX_EPOCH;
Calendar calMonthAtPosition = (Calendar) calendarMonthEpoch.clone();
calMonthAtPosition.add(Calendar.MONTH, offset % MONTHS_PER_YEAR);
calMonthAtPosition.add(Calendar.YEAR, offset / MONTHS_PER_YEAR);
return calMonthAtPosition;
}
// ...
}