范围选择中的行为差异(材质日历视图)

pdsfdshx  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(271)

另外,我在这里为lib打开了一个问题。
我需要执行范围日期选择,所以我发现这个库合适的链接。
但这真的让我不安。行为范围选择中的问题:
案例:
1) 因此,您需要选择1.09到5.09之间的日期(没有问题),然后尝试单击选择中的第一个(1.09)或最后一个(05.09)日期。所有选中的日子都变成未选中的(这是正确的行为)。
视频:https://youtu.be/bprcy1ibpy4
2) 所以,你需要选择一天之内从1.09到3.09的日期(没有问题),然后尝试点击选择中的第一个(1.09)或最后一个(3.09)日期。您将再次获得选择范围(但没有选择日期)。示例:单击1.09而不是3.09,然后再次单击03.09,现在您将看到从1.09到2.09的选择范围(这确实是意外的结果)。
视频:https://youtu.be/rn70_htbvua
我试图克隆MaterialCalendarView项目并对其进行管理,但我不太了解它是如何工作的。
如果你有什么问题尽管问。
那么问题:如何管理这个库来呈现一个稳定的行为呢?我更喜欢这样,如果我选择了日期范围,并单击选择中的第一天或最后一天,这样所有日期都将取消选择。

nue99wik

nue99wik1#

问题在于这个代码块(链接到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变量告诉我们是否正在进行选择或取消选择。

相关问题