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 ???
- Cambiar dinámicamente el color de la imagen SVG en android
- GridView dentro de la lista expandible en android
- SetWidth () Botón de Android
- ¿Cuándo se llama a View.onMeasure ()?
- Cómo deshabilitar el oyente de clics en la vista de la imagen de Android
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; }
- Android ImageView Escalado y traducción del problema
- La Android RatingBar tiene umbral "malo" para ciertos dispositivos, ¿arreglarlo?
- Cómo rellenar una vista de cuadrícula en XML
- Android - Cómo permitir el desplazamiento horizontal y vertical
- Soporte de vista de Android para ViewPager
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.