奇怪的数组列表结果?

Weird arraylist result?

我将在前 3 个月的每个星期六和星期日日期添加到数组列表中。

但是,当我遍历数组时,为了检查值是否真的正确,我似乎只得到了几个元素(尽管数组的大小仍然正确 -> 例如,只有两个元素数组,而大小为 26)。

有什么帮助吗?

info.setContentView(R.layout.calendar_dialog);
        CalendarView calendarView = info.findViewById(R.id.calendarView);

        Calendar currentDate = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
        max.add(Calendar.MONTH,3);
        calendarView.setMinimumDate(currentDate);
        calendarView.setMaximumDate(max);


        Calendar temp = Calendar.getInstance();
        ArrayList<Calendar> calendars = new ArrayList<>();
        calendars.add(temp);

        while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH)) {

            temp.add(Calendar.DATE, 1);

            if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7) {
                calendars.add(temp);
            }
        }

        calendarView.setDisabledDays(calendars);

        info.findViewById(R.id.calendar_ok).setOnClickListener(v -> info.dismiss());
        info.show();

您一遍又一遍地向数组列表添加相同的对象 (temp)。 改为这样做:

calendars.add(temp.clone());

你有两个错误:

1) 条件while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH)) 没有考虑年的变化,如果周期结束于新的一年final/beginning。比较 2018 年 11 月和 2019 年 2 月将因该条件而失败。

2) 您不应一遍又一遍地添加相同的日历实例:calendars.add(temp);。相反,对实例进行深度克隆 (temp.clone()),并在列表中每次添加一个具有正确值的新实例。

问题是您在 temp 变量中只使用了 Calendar 的单个实例。您在 while 循环的每次迭代中修改它,并将相同的引用存储在 calendars 列表中。

最后,calendars 列表包含许多(你说是 26)项,但它们都引用完全相同的 Calendar 实例,该实例在每次迭代中都被修改。

解决方案是在将其添加到列表之前构建全新的日历实例:

...
if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7){
    calendars.add((Calendar)temp.clone());
}
...