android view calendar android-custom-view invalidate

android - no se llama a las vistas de niños ondraw() después de invalidar el contenedor linearlayout



view calendar (1)

Si invalidate() se llama en el nivel de Diseño, que el diseño decide, qué partes de él se deben volver a dibujar. Por lo tanto, llama a invalidate() solo en las vistas secundarias, que están afectadas / sucias. Ninguno de los cambios en una celda son visibles para el diseño, por lo que el diseño no ve la necesidad de invalidar a ningún niño.

Debería dejar que la vista se invalide cuando sea necesario volver a dibujarla. En su caso, agregaría una llamada para invalidateSelf() a setParamView invalidateSelf() en el método setParamView . Hasta donde yo entiendo el código, este es el método que es responsable de decorar una celda como un día en el calendario.

Estoy escribiendo una vista de calendario. Cuando presioné el botón del mes siguiente, llamé a mCalendarContainerLL.invalidate (); pero mis vistas personalizadas no se redibujaron. El método onDraw en mi vista personalizada no se llamó.

Ps: Si invalido directamente todas las vistas de celda de calendario. Funciona. ¿Por qué sucedió esto?

Aquí está el código:

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