奇怪的arraylist结果?

时间:2019-05-04 19:57:43

标签: java android arraylist calendarview

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

但是,当我遍历数组以检查值是否正确时,我似乎只得到了几个元素(尽管数组的大小仍然是正确的->例如,数组中只有两个元素,而尺寸为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();

3 个答案:

答案 0 :(得分:0)

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

calendars.add(temp.clone());

答案 1 :(得分:0)

您在这里有两个错误:

1)如果期间接近新的年末/年初,则条件while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH))不考虑年份的变化。在这种情况下,比较2018年11月和2019年2月将失败。

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

答案 2 :(得分:0)

问题在于您仅在Calendar变量中使用temp的单个实例。您可以在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());
}
...