5

カレンダー ビューを作成しています。次の月のボタンを押したときに mCalendarContainerLL.invalidate(); を呼び出しますが、カスタム ビューは再描画されませんでした。カスタム ビューの onDraw メソッドは呼び出されませんでした。

Ps:すべてのカレンダー セル ビューを直接無効にすると、機能します。どうしてこうなった???

コードは次のとおりです。

private CalendarWidgetDayCell updateCalendarView() {

        CalendarWidgetDayCell dayCellSelected = null;
        boolean isSelected = false;

        final boolean isHasSelection = (mCalendarSelected.getTimeInMillis() != 0);

        final int selectedYear = mCalendarSelected.get(Calendar.YEAR);
        final int selectedMonth = mCalendarSelected.get(Calendar.MONTH);
        final int selectedDay = mCalendarSelected.get(Calendar.DAY_OF_MONTH);

        Calendar dateXOfCalendar = Calendar.getInstance();
        dateXOfCalendar.setTimeInMillis(mStartDateCurrentMonth.getTimeInMillis());

        Log.d(tag, "updateCalendarView cpt_func_ " + "mDayCellList.size(): " + mDayCellList.size());
        for (int i = 0; i < mDayCellList.size(); i++) {
            final int yearOfCellItem = dateXOfCalendar.get(Calendar.YEAR);
            final int monthOfCellItem = dateXOfCalendar.get(Calendar.MONTH);
            final int dayOfCellItem = dateXOfCalendar.get(Calendar.DAY_OF_MONTH);
            final int dayOfWeekOfCellItem = dateXOfCalendar.get(Calendar.DAY_OF_WEEK);
            CalendarWidgetDayCell dayCellItem = mDayCellList.get(i);

            boolean isToday = false;
            if (mCalendarToday.get(Calendar.YEAR) == yearOfCellItem) {
                if (mCalendarToday.get(Calendar.MONTH) == monthOfCellItem) {
                    if (mCalendarToday.get(Calendar.DAY_OF_MONTH) == dayOfCellItem) {
                        isToday = true;
                    }
                }
            }

            // check holiday
            boolean isHoliday = false;
            if ((dayOfWeekOfCellItem == Calendar.SATURDAY) || (dayOfWeekOfCellItem == Calendar.SUNDAY))
                isHoliday = true;
            if ((monthOfCellItem == Calendar.JANUARY) && (dayOfCellItem == 1))
                isHoliday = true;

            isSelected = false;
            if (isHasSelection) {
                if ((selectedDay == dayOfCellItem) && (selectedMonth == monthOfCellItem)
                        && (selectedYear == yearOfCellItem)) {
                    isSelected = true;
                }
            }
            dayCellItem.setSelected(isSelected);

            boolean hasRecord = false;

            if (isSelected)
                dayCellSelected = dayCellItem;

            dayCellItem.setViewParam(yearOfCellItem, monthOfCellItem, dayOfCellItem, isToday, isHoliday,
                    mCurrentMonthInCalendar, hasRecord);

            dayCellItem.invalidate();//It works well.
            dateXOfCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }

        // mCalendarContainerLL.invalidate();//This is not working as expected.
        return dayCellSelected;
    }
4

1 に答える 1

5

がレイアウト レベルで呼び出された場合invalidate()、レイアウトが決定するよりも、レイアウトのどの部分を再描画する必要があります。したがってinvalidate()、影響を受ける/ダーティな子ビューのみを呼び出します。1 つのセルに対する変更はレイアウトに表示されないため、レイアウトは子を無効にする必要性を認識しません。

ビューを再描画する必要がある場合は、ビュー自体を無効にする必要があります。あなたの場合invalidateSelf()setParamViewメソッドに呼び出しを追加します。私がコードを理解している限り、これはカレンダーで 1 つのセルを 1 日として装飾する責任があるメソッドです。

于 2013-11-15T03:45:47.887 に答える