5

私はあなたが月の間でスワイプすることを可能にする私のAndroidアプリのためのカスタムカレンダービューを構築しています。カスタムカレンダーの正方形のビューを作成し、それをカスタムのカレンダーののビューに埋め込みました。すべてが1か月のスケールで完全に機能しています。

残念ながら、今は行き詰まっています。ここで、カスタムカレンダーの月のビューを無限ビューのページャーに埋め込んで、カレンダーを無制限に前後にスクロールできるようにします。

簡単なトリックを使用して、この水平ページャーを無限スクロールに適合させてみました。カレンダーの月のビューを3つ並べて保持し、ユーザーがスクロールした場所に基づいてリストを更新します。例...

  1. [7月、8月、9月](焦点は8月で、ユーザーは9月にスワイプします)
  2. [7月、8月、9月](現在は9月に焦点を当てています)
  3. [ 8月、8月、9月](8月を1つ左にシフト、7月を上書き)
  4. [8月、9月9月](9月を1つ左にシフト、8月を上書き)
  5. [8月、9月、9月](9月中旬にビューを設定するので、再び中央に配置されます)
  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. [7月、8月、9月](焦点は8月で、ユーザーは9月にスワイプします)
  2. [7月、8月、9月](現在は9月に焦点を当てています)
  3. [8月、9月](7月は削除しますが、リサイクルのために保管してください)
  4. [8月、9月、10月](7月をリサイクルして、代わりに10月を表示し、ビューを追加します)

現在フォーカスされているビューにはまったく触れていませんが、まだフラッシュがあります。今回は、9月から8月にかけて画面が点滅し、その後9月に戻ります。

だから私は何が間違っているのですか?ユーザーが知らないうちに、私がやろうとしていることを実行する方法はありますか?そうでない場合、活用できる既存のクラスはありますか?

(副次的な質問として、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 に答える