另外,我为lib here打开了一个问题。
我需要实现范围日期选择,所以我发现这个lib适合link。
但它确实让我感到不安。行为范围选择中的问题:
案例:
1)因此,会说您需要选择1.09到5.09之间的日期(没有问题),然后尝试在选择中点击第一个(1.09)或最后一个(05.09)日期。所有选定的日期都会被取消选择(这是正确的行为)。
视频:https://youtu.be/bprcy1IBpy4
2)所以,你会说你需要在一天之内选择1.09到03.09之间的日期(没有问题),并且在选择中尝试点击第一个(1.09)或最后一个(3.09)日期。您将再次获得选择范围(但没有选择日期)。示例:单击1.09而不是3.09,然后再次单击03.09,现在您可以看到从1.09到2.09的选择范围(这是非常意外的结果)。
视频:https://youtu.be/rN70_HTbvUA
我尝试克隆matirial-calendarview项目并对其进行管理,但我不太了解它是如何工作的。
如果您有任何问题,请随时提出。
所以问题:如何管理这个lib来呈现一个稳定的行为?我更喜欢这样,如果我选择了日期范围并点击选择的第一天或最后一天,那么所有日期都会取消选择。
答案 0 :(得分:2)
问题在于此代码块(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变量告知是否正在进行选择或取消选择。