问题出在这段代码块中 (
在github上查看源文件)
当我们在日历中选择两天时,这意味着我们正在选择日期范围的开始日期和结束日期。 这段代码块是为范围选择而设计的。
} else if (adapter.getSelectedDates().size() == 2) {
final List<CalendarDay> dates = adapter.getSelectedDates();
if (dates.get(0).isAfter(dates.get(1))) {
dispatchOnRangeSelected(dates.get(1), dates.get(0));
} else {
dispatchOnRangeSelected(dates.get(0), dates.get(1));
}
}
当我们选择一个范围时,比如由第2、3、4、5天组成的范围,那么所选日期列表的大小为4。当我们点击日期以取消选择范围时,在清除列表之前,此日期将从所选日期列表中移除,现在列表包含3个元素。因此,执行此代码块,该代码块用于清除所选范围。
if (adapter.getSelectedDates().size() > 2) {
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected); // re-set because adapter has been cleared
dispatchOnDateSelected(date, nowSelected);
如果日期范围包括4天或更多天,则一切正常。当日期范围为2或3天时,“取消选择范围”后所选日期的大小分别变为1或2(大小-1是因为在取消选择范围之前,所点击的日期已从所选范围中删除),并且范围未清除,因为条件
if (adapter.getSelectedDates().size() > 2) {
未满足要求。
为了解决这个问题,您可以检查选择或取消选择是否发生,并执行正确的逻辑。我的快速修复方法是
case SELECTION_MODE_RANGE: {
adapter.setDateSelected(date, nowSelected);
if (adapter.getSelectedDates().size() > 2) {
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected);
dispatchOnDateSelected(date, nowSelected);
} else if (adapter.getSelectedDates().size() == 2) {
final List<CalendarDay> dates = adapter.getSelectedDates();
if (nowSelected) {
if (dates.get(0).isAfter(dates.get(1))) {
dispatchOnRangeSelected(dates.get(1), dates.get(0));
} else {
dispatchOnRangeSelected(dates.get(0), dates.get(1));
}
} else {
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected);
dispatchOnDateSelected(date, nowSelected);
}
} else {
if (nowSelected) {
adapter.setDateSelected(date, nowSelected);
dispatchOnDateSelected(date, nowSelected);
} else {
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected);
dispatchOnDateSelected(date, nowSelected);
}
}
}
break;
我从调试器输出中推断,现在选择的变量告诉我们正在发生选择还是取消选择。