Java 奇怪的arraylist结果?

Java 奇怪的arraylist结果?,java,android,arraylist,calendarview,Java,Android,Arraylist,Calendarview,在前3个月内,我将每个星期六和星期日添加到数组列表中 但是,当我遍历数组时,为了检查值是否确实正确,我似乎只得到了几个元素(虽然数组的大小仍然正确->例如,数组中只有两个元素,而大小是26) 有什么帮助吗 info.setContentView(R.layout.calendar_dialog); CalendarView calendarView = info.findViewById(R.id.calendarView); Calendar currentD

在前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();
info.setContentView(R.layout.calendar\u对话框);
CalendarView CalendarView=info.findViewById(R.id.CalendarView);
Calendar currentDate=Calendar.getInstance();
Calendar max=Calendar.getInstance();
最大添加(日历月,3);
calendarView.setMinimumDate(当前日期);
calendarView.setMaximumDate(最大值);
Calendar temp=Calendar.getInstance();
ArrayList日历=新建ArrayList();
日历。添加(临时);
while(临时获取(日历月)info.disease());
info.show();

您正在一次又一次地将同一对象(
temp
)添加到arraylist。 改为这样做:

calendars.add(temp.clone());

你有两个错误:

1) 当(临时获取(日历月)期间在新的一年的最后一年/开始时,不考虑年份的变化。与2018年11月和2019年2月相比,在这种情况下将失败


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

问题在于,在
temp
变量中只使用
日历的单个实例。您可以在
的每次迭代中修改它,同时
循环并将相同的引用存储在
日历
列表中

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

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

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

缺少强制转换,它应该是:
calendars.add((Calendar)temp.clone())为什么在我的回答之后,你会将重复回答标记为已接受?(顺便说一句,不太准确)