2017-09-04 92 views
3

另外,我爲lib here打開了一個問題。範圍選擇中的行爲差異(material-calendarview)

我需要執行範圍日期選擇,所以我發現這個lib適合link

但它真的讓我感到不安。在行爲範圍選擇的問題:

案例:

1)因此,會說你需要選擇日期從1.09至5.09(沒有問題),然後試着點擊第一(1.09)或最後(05.09)選擇日期。所有選定的日子將進入未選中狀態(這是正確的行爲)。

視頻:https://youtu.be/bprcy1IBpy4

2)因此,會說你需要從1.091天差異選擇日期以03.09(沒有問題),比試着點擊第一(1.09)或最後( 3.09)選擇日期。您將再次獲得選擇範圍(但沒有選定日期)。例如:點擊1.09而不是3.09,然後再次點擊03.09,現在你會看到從1.09到2.09的選擇範圍(這真是意想不到的結果)。

視頻:https://youtu.be/rN70_HTbvUA

我試圖克隆matirial-calendarview項目和管理它,但我沒有那麼強,以瞭解它是如何工作的。

如果您有任何問題隨時問。

所以問題:如何管理這個庫以呈現一個穩定的行爲?我更喜歡這樣,如果我選擇了日期範圍,並點擊第一天或最後一天進行選擇,所有日期都將取消選擇。

+0

所以它到底是做什麼的,它是否選擇了開放式的範圍,而你希望它選擇封閉式範圍? –

+0

@ M.Prokhorov在問題 –

+0

中添加了視頻啊,所以根據日期範圍內有多少日期(取決於範圍跨度),範圍行爲有所不同,邊緣情況是範圍跨度中的2個和3個日期。這看起來似乎是MaterialCalendarView實現中的一個錯誤(通過[this line](https://github.com/prolificinteractive/material-calendarview/blob/master/library/src/main/java/com/prolificinteractive/materialcalendarview/) MaterialCalendarView.java#L1436),它檢查選擇的大小)。您應該監視您創建的github問題。 –

回答

1

問題就出在這個代碼塊(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變量告知用戶,如果選擇或停止正在發生的事情。