Children's views ondraw () no llamado después invalidate linearlayout container

Estoy escribiendo una vista del calendario. Cuando presioné el botón del mes siguiente, llamo a mCalendarContainerLL.invalidate (); Pero mis vistas de encargo no fueron redibujadas. El método de onDraw en mi opinión de encargo no fue llamado.

Ps: Si invalide 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; } 

Si se invalidate() en el nivel Layout, que el diseño decida, que partes de la misma tiene que volver a dibujar. Por lo tanto, invoca invalidate() sólo en las vistas secundarias, que están afectadas / sucias. No los cambios de 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.

Debe permitir que la vista se invalide, cuando es necesario volver a dibujarla. En su caso añadiría una llamada a invalidateSelf() en el método setParamView . Por lo que entiendo el código, este es el método que es responsable de decorar una celda como un día en el calendario.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.