gpt4 book ai didi

java - 范围选择的行为差异( Material 日历 View )

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:30 27 4
gpt4 key购买 nike

此外,我为 lib here 打开了一个问题.

我需要实现范围日期选择,所以我发现这个库适合 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 项目并管理它,但我不太了解它是如何工作的。

如果您有任何问题,请随时提出。

所以问题:如何管理这个库以呈现一种稳定的行为?我更喜欢这样,如果我选择了日期范围并单击选择中的第一天或最后一天,那么所有日期都会取消选择。

最佳答案

问题出在这个代码块(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 变量告诉我们是选择还是取消选择。

关于java - 范围选择的行为差异( Material 日历 View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com