选定范围时的行为差异(material-calendarview)

4
此外,我为lib在这里开了一个问题。我需要实现日期范围选择,所以我找到了这个合适的库链接。但是它真的让我很困扰。问题在于行为范围选择上:案例: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项目并进行管理,但我不是很强大,无法理解它的工作原理。如果您有任何问题,请随时问。因此问题:如何管理此库以呈现一种稳定的行为?如果我选择了日期范围并单击选择中的第一天或最后一天,则所有日期都将取消选择。

最终它所做的是选择具有开放端的范围,而您希望它选择具有封闭端的范围? - M. Prokhorov
@M.Prokhorov在问题中添加了视频。 - Sirop4ik
啊,所以范围行为取决于日期范围内有多少个日期(取决于范围跨度),边缘情况是范围跨度中有2个和3个日期。根据此行的判断(它检查选择的大小),这似乎是MaterialCalendarView实现中的一个错误。您应该监视您创建的Github问题。 - M. Prokhorov
@M.Prokhorov 是的,这正是我发现的一样,但我试图深入挖掘并理解这个数组大小如何取决于。但对我来说很复杂。 - Sirop4ik
在我看来,它似乎只是在你点击任何选定的日期时更改范围。只取消选择日期或向另一端包括你点击的日期的日期。 - muasif80
显示剩余2条评论
1个回答

2
问题出在这段代码块中 (在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;

我从调试器输出中推断,现在选择的变量告诉我们正在发生选择还是取消选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接