問題就出在這個代碼塊(link to source file in 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); // re-set because adapter has been cleared
dispatchOnDateSelected(date, nowSelected);
} else if (adapter.getSelectedDates().size() == 2) {
final List<CalendarDay> dates = adapter.getSelectedDates();
if (nowSelected) { // when selecting
if (dates.get(0).isAfter(dates.get(1))) {
dispatchOnRangeSelected(dates.get(1), dates.get(0));
} else {
dispatchOnRangeSelected(dates.get(0), dates.get(1));
}
} else { // in case range initially consisted of 3 dates, and now deselection happens
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected); // re-set because adapter has been cleared
dispatchOnDateSelected(date, nowSelected);
}
} else {
if (nowSelected) {
adapter.setDateSelected(date, nowSelected);
dispatchOnDateSelected(date, nowSelected);
} else { // in case range initially consisted of 2 dates, and now deselection happens
adapter.clearSelections();
adapter.setDateSelected(date, nowSelected); // re-set because adapter has been cleared
dispatchOnDateSelected(date, nowSelected);
}
}
}
break;
我從調試器輸出假定,nowSelected變量告知用戶,如果選擇或停止正在發生的事情。
所以它到底是做什麼的,它是否選擇了開放式的範圍,而你希望它選擇封閉式範圍? –
@ M.Prokhorov在問題 –
中添加了視頻啊,所以根據日期範圍內有多少日期(取決於範圍跨度),範圍行爲有所不同,邊緣情況是範圍跨度中的2個和3個日期。這看起來似乎是MaterialCalendarView實現中的一個錯誤(通過[this line](https://github.com/prolificinteractive/material-calendarview/blob/master/library/src/main/java/com/prolificinteractive/materialcalendarview/) MaterialCalendarView.java#L1436),它檢查選擇的大小)。您應該監視您創建的github問題。 –