Kotlin中如何将API返回的日期高亮显示在Highlightable-Calendar-View上?
问题原因
你遇到的报错有两个核心问题:
PlannerGet是数据类的类名,不能直接调用类的date属性,需要使用API返回的PlannerGet实例对象读取date字段。Calendar.set()没有接收单个字符串/单个整型的重载,你需要先把接口返回的日期字符串解析为可识别的日期对象,再赋值给Calendar实例。
正确实现
首先确认你接口返回的date字段的格式,以下示例假设格式为yyyy-MM-dd,如果是其他格式修改对应日期解析的pattern即可。
单个日期高亮
// 1. 取API返回的PlannerGet单个实例,替换为你自己的变量名 val plannerItem: PlannerGet = /* API返回的单条数据 */ // 2. 解析日期字符串 val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) val targetDate = dateFormat.parse(plannerItem.date) ?: return // 解析失败直接中断逻辑 // 3. 构造Calendar实例并设置高亮 HighlightableCalendarView.dayDecorators = listOf( DayDecorator( Calendar.getInstance().apply { time = targetDate }, Color.parseColor("#ffffff"), Color.parseColor("#ff0000") ) )
批量高亮API返回的所有日期
如果接口返回的是List<PlannerGet>列表,可批量构造装饰器:
// 1. 取API返回的PlannerGet列表,替换为你自己的变量名 val plannerList: List<PlannerGet> = /* API返回的数据列表 */ val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) // 2. 批量构造装饰器,解析失败的项自动跳过 val dayDecorators = plannerList.mapNotNull { item -> val targetDate = dateFormat.parse(item.date) ?: return@mapNotNull null DayDecorator( Calendar.getInstance().apply { time = targetDate }, Color.parseColor("#ffffff"), Color.parseColor("#ff0000") ) } // 3. 赋值给日历控件 HighlightableCalendarView.dayDecorators = dayDecorators
注意事项
如果你的项目适配Android 8.0及以上,推荐使用java.time包的API解析日期,避免SimpleDateFormat的线程安全问题:
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault()) val localDate = LocalDate.parse(plannerItem.date, formatter) val calendar = Calendar.getInstance().apply { // Calendar月份从0开始计数,所以要减1 set(localDate.year, localDate.monthValue - 1, localDate.dayOfMonth) }
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

