范围选择中的行为差异(material-calendarview)

时间:2017-09-04 12:33:28

标签: java android calendar

另外,我为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来呈现一个稳定的行为?我更喜欢这样,如果我选择了日期范围并点击选择的第一天或最后一天,那么所有日期都会取消选择。

1 个答案:

答案 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变量告知是否正在进行选择或取消选择。