You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何将API返回的日期高亮显示在Highlightable-Calendar-View上?

问题原因

你遇到的报错有两个核心问题:

  1. PlannerGet是数据类的类名,不能直接调用类的date属性,需要使用API返回的PlannerGet实例对象读取date字段。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:54:03