Android Calendar存入Model后循环值异常问题咨询
这是一个典型的引用类型 vs 值类型的问题,我来帮你拆解清楚:
核心原因
Calendar 是引用类型,而你的 mDay 应该是字符串或者整数这类值类型(或者像Java里String这样的不可变类型)。
当你在循环里操作时,会出现这样的差异:
- 你大概率只创建了一个
Calendar对象,每次循环只是修改它的日期值,然后把这个对象的引用赋值给Model实例的mCalendar字段。所有Model实例其实都指向同一个Calendar对象,当循环结束时,这个对象的状态是最后一次循环修改后的样子,所以所有Model的mCalendar都会显示最后一次的数值。 - 而
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
相关产品推荐
相关产品推荐

