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

Android Calendar存入Model后循环值异常问题咨询

这是一个典型的引用类型 vs 值类型的问题,我来帮你拆解清楚:

核心原因

Calendar 是引用类型,而你的 mDay 应该是字符串或者整数这类值类型(或者像Java里String这样的不可变类型)。

当你在循环里操作时,会出现这样的差异:

  1. 你大概率只创建了一个Calendar对象,每次循环只是修改它的日期值,然后把这个对象的引用赋值给Model实例的mCalendar字段。所有Model实例其实都指向同一个Calendar对象,当循环结束时,这个对象的状态是最后一次循环修改后的样子,所以所有Model的mCalendar都会显示最后一次的数值。
  2. 而mDay不一样,每次循环你应该是生成了一个新的字符串/数值(比如String.valueOf(day)或者直接赋值int),这些值类型会把实际的数值复制到Model的mDay字段里,每个Model都持有自己独立的那份值,所以能正确显示对应的日期。

解决方案

要解决这个问题,你需要在每次循环里都创建一个新的Calendar对象,而不是复用同一个。有两种常见的实现方式:

方式1:每次循环新建Calendar实例

// 不要在循环外提前创建Calendar,而是在循环内部初始化
for (int i = 0; i < 10; i++) {
    Calendar calendar = Calendar.getInstance(); // 每次循环生成新实例
    calendar.add(Calendar.DAY_OF_MONTH, i); // 修改当前实例的日期
    YourModel model = new YourModel();
    model.setmCalendar(calendar);
    model.setmDay(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
    // 将model加入你的数据列表
}

方式2:克隆已有Calendar实例(适合基于初始日期叠加的场景)

如果你的逻辑是基于某个初始Calendar来逐步修改日期,可以每次循环克隆当前的Calendar对象,避免引用同一个实例:

Calendar baseCalendar = Calendar.getInstance(); // 初始基准日期
for (int i = 0; i < 10; i++) {
    Calendar calendar = (Calendar) baseCalendar.clone(); // 克隆出独立的新对象
    calendar.add(Calendar.DAY_OF_MONTH, i);
    YourModel model = new YourModel();
    model.setmCalendar(calendar);
    model.setmDay(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
    // 将model加入你的数据列表
}

这样每个Model都会持有自己独立的Calendar实例,各自保存对应的日期状态,就不会出现全部指向最后一次循环值的问题了。

内容的提问来源于stack exchange,提问作者BejanCorneliu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:00:00