5

我正在为我的 android 应用程序构建一个自定义日历视图,允许您在几个月之间滑动。我创建了自定义日历方形视图,并将其嵌入到自定义日历视图中,并且在 1 个月的范围内一切正常。

不幸的是,现在我被困住了。我现在想将我的自定义日历月视图嵌入到无限视图寻呼机中,这样我就可以无限期地向前和向后滚动日历。

我已经尝试使用一个简单的技巧来调整这个水平寻呼机以进行无限滚动。我持有一组 3 个日历月视图,并根据用户滚动到的位置更新列表。例子...

  1. 【七月、八月、九月】(重点是八月,然后用户滑动到九月)
  2. [七月、八月、九月](现在重点在九月)
  3. [ August , August, September ](八月左移一位,覆盖七月)
  4. [August, September , September ](将九月左移一位,覆盖八月)
  5. [August, September , September](将视图设置为九月中旬,所以我们再次居中)
  6. [8 月、9 月10 月](用实际的下个月覆盖 9 月 2 日)

但是,当我这样做时,当滑动到下个月时,屏幕上会出现明显的闪光。

这是向前滚动的代码(注意:向后滚动有同样的问题)

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 的视图仍在更新。我尝试通过使用以下策略来解决这个问题......

  1. 【七月、八月、九月】(重点是八月,然后用户滑动到九月)
  2. [七月、八月、九月](现在重点在九月)
  3. [8 月、9 月](除去 7 月,但将其存放起来以供回收利用)
  4. [August, September , October](循环使用七月改为显示十月,并添加视图)

我根本没有触及当前聚焦的视图,但仍然有一个闪光!这一次,屏幕从九月闪烁到八月,然后又回到九月。

那么我做错了什么?有没有办法在用户不知道的情况下做我想做的事情?如果没有,我可以利用现有的课程吗?

(作为一个附带问题,有什么方法可以直观地自定义 Android CalendarView?那真的可以解决我所有的问题......)

提前致谢!

4

1 回答 1

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

    // ...

}
于 2012-09-06T15:24:19.340 回答