@@ -70,10 +70,13 @@ public class WeekView extends View {
70
70
private Paint mEventBackgroundPaint ;
71
71
private float mHeaderColumnWidth ;
72
72
private List <EventRect > mEventRects ;
73
+ private List <WeekViewEvent > mPreviousPeriodEvents ;
74
+ private List <WeekViewEvent > mCurrentPeriodEvents ;
75
+ private List <WeekViewEvent > mNextPeriodEvents ;
73
76
private TextPaint mEventTextPaint ;
74
77
private Paint mHeaderColumnBackgroundPaint ;
75
78
private Scroller mStickyScroller ;
76
- private int mFetchedMonths [] = new int [ 3 ];
79
+ private int mFetchedPeriod = - 1 ; // the middle period the calendar has fetched.
77
80
private boolean mRefreshEvents = false ;
78
81
private float mDistanceY = 0 ;
79
82
private float mDistanceX = 0 ;
@@ -126,7 +129,7 @@ public class WeekView extends View {
126
129
// Listeners.
127
130
private EventClickListener mEventClickListener ;
128
131
private EventLongPressListener mEventLongPressListener ;
129
- private MonthChangeListener mMonthChangeListener ;
132
+ private WeekViewLoader mWeekViewLoader ;
130
133
private EmptyViewClickListener mEmptyViewClickListener ;
131
134
private EmptyViewLongPressListener mEmptyViewLongPressListener ;
132
135
private DateTimeInterpreter mDateTimeInterpreter ;
@@ -531,7 +534,9 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
531
534
532
535
// Get more events if necessary. We want to store the events 3 months beforehand. Get
533
536
// events only when it is the first iteration of the loop.
534
- if (mEventRects == null || mRefreshEvents || (dayNumber == leftDaysWithGaps + 1 && mFetchedMonths [1 ] != day .get (Calendar .MONTH )+1 && day .get (Calendar .DAY_OF_MONTH ) == 15 )) {
537
+ if (mEventRects == null || mRefreshEvents ||
538
+ (dayNumber == leftDaysWithGaps + 1 && mFetchedPeriod != (int ) mWeekViewLoader .toWeekViewPeriodIndex (day ) &&
539
+ Math .abs (mFetchedPeriod - mWeekViewLoader .toWeekViewPeriodIndex (day )) > 0.5 )) {
535
540
getMoreEvents (day );
536
541
mRefreshEvents = false ;
537
542
}
@@ -785,59 +790,60 @@ public EventRect(WeekViewEvent event, WeekViewEvent originalEvent, RectF rectF)
785
790
* @param day The day where the user is currently is.
786
791
*/
787
792
private void getMoreEvents (Calendar day ) {
788
-
789
- // Delete all events if its not current month +- 1.
790
- deleteFarMonths (day );
791
-
792
793
// Get more events if the month is changed.
793
794
if (mEventRects == null )
794
795
mEventRects = new ArrayList <EventRect >();
795
- if (mMonthChangeListener == null && !isInEditMode ())
796
+ if (mWeekViewLoader == null && !isInEditMode ())
796
797
throw new IllegalStateException ("You must provide a MonthChangeListener" );
797
798
798
799
// If a refresh was requested then reset some variables.
799
800
if (mRefreshEvents ) {
800
801
mEventRects .clear ();
801
- mFetchedMonths = new int [3 ];
802
- }
803
-
804
- // Get events of previous month.
805
- int previousMonth = (day .get (Calendar .MONTH ) == 0 ?12 :day .get (Calendar .MONTH ));
806
- int nextMonth = (day .get (Calendar .MONTH )+2 == 13 ?1 :day .get (Calendar .MONTH )+2 );
807
- int [] lastFetchedMonth = mFetchedMonths .clone ();
808
- if (mFetchedMonths [0 ] < 1 || mFetchedMonths [0 ] != previousMonth || mRefreshEvents ) {
809
- if (!containsValue (lastFetchedMonth , previousMonth ) && !isInEditMode ()){
810
- List <WeekViewEvent > events = mMonthChangeListener .onMonthChange ((previousMonth ==12 )?day .get (Calendar .YEAR )-1 :day .get (Calendar .YEAR ), previousMonth );
811
- sortEvents (events );
812
- for (WeekViewEvent event : events ) {
813
- cacheEvent (event );
814
- }
815
- }
816
- mFetchedMonths [0 ] = previousMonth ;
802
+ mPreviousPeriodEvents = null ;
803
+ mCurrentPeriodEvents = null ;
804
+ mNextPeriodEvents = null ;
805
+ mFetchedPeriod = -1 ;
817
806
}
818
807
819
- // Get events of this month.
820
- if ( mFetchedMonths [ 1 ] < 1 || mFetchedMonths [ 1 ] != day . get ( Calendar . MONTH )+ 1 || mRefreshEvents ) {
821
- if (!containsValue ( lastFetchedMonth , day . get ( Calendar . MONTH )+ 1 ) && ! isInEditMode ( )) {
822
- List <WeekViewEvent > events = mMonthChangeListener . onMonthChange ( day . get ( Calendar . YEAR ), day . get ( Calendar . MONTH ) + 1 ) ;
823
- sortEvents ( events ) ;
824
- for ( WeekViewEvent event : events ) {
825
- cacheEvent ( event );
826
- }
827
- }
828
- mFetchedMonths [ 1 ] = day . get ( Calendar . MONTH )+ 1 ;
829
- }
830
-
831
- // Get events of next month.
832
- if ( mFetchedMonths [ 2 ] < 1 || mFetchedMonths [ 2 ] != nextMonth || mRefreshEvents ) {
833
- if (! containsValue ( lastFetchedMonth , nextMonth ) && ! isInEditMode ()) {
834
- List < WeekViewEvent > events = mMonthChangeListener . onMonthChange ( nextMonth == 1 ? day . get ( Calendar . YEAR ) + 1 : day . get ( Calendar . YEAR ), nextMonth );
835
- sortEvents ( events ) ;
836
- for ( WeekViewEvent event : events ) {
837
- cacheEvent ( event );
808
+ if ( mWeekViewLoader != null ){
809
+ int periodToFetch = ( int ) mWeekViewLoader . toWeekViewPeriodIndex ( day );
810
+ if (!isInEditMode () && ( mFetchedPeriod < 0 || mFetchedPeriod != periodToFetch || mRefreshEvents )) {
811
+ List <WeekViewEvent > previousPeriodEvents = null ;
812
+ List < WeekViewEvent > currentPeriodEvents = null ;
813
+ List < WeekViewEvent > nextPeriodEvents = null ;
814
+
815
+ if ( mPreviousPeriodEvents != null && mCurrentPeriodEvents != null && mNextPeriodEvents != null ){
816
+ if ( periodToFetch == mFetchedPeriod - 1 ){
817
+ currentPeriodEvents = mPreviousPeriodEvents ;
818
+ nextPeriodEvents = mCurrentPeriodEvents ;
819
+ } else if ( periodToFetch == mFetchedPeriod ){
820
+ previousPeriodEvents = mPreviousPeriodEvents ;
821
+ currentPeriodEvents = mCurrentPeriodEvents ;
822
+ nextPeriodEvents = mNextPeriodEvents ;
823
+ } else if ( periodToFetch == mFetchedPeriod + 1 ){
824
+ previousPeriodEvents = mCurrentPeriodEvents ;
825
+ currentPeriodEvents = mNextPeriodEvents ;
826
+ }
838
827
}
828
+ if (currentPeriodEvents == null )
829
+ currentPeriodEvents = mWeekViewLoader .onLoad (periodToFetch );
830
+ if (previousPeriodEvents == null )
831
+ previousPeriodEvents = mWeekViewLoader .onLoad (periodToFetch -1 );
832
+ if (nextPeriodEvents == null )
833
+ nextPeriodEvents = mWeekViewLoader .onLoad (periodToFetch +1 );
834
+
835
+
836
+ //clear events
837
+ mEventRects .clear ();
838
+ sortAndCacheEvents (previousPeriodEvents );
839
+ sortAndCacheEvents (currentPeriodEvents );
840
+ sortAndCacheEvents (nextPeriodEvents );
841
+
842
+ mPreviousPeriodEvents = previousPeriodEvents ;
843
+ mCurrentPeriodEvents = currentPeriodEvents ;
844
+ mNextPeriodEvents = nextPeriodEvents ;
845
+ mFetchedPeriod = periodToFetch ;
839
846
}
840
- mFetchedMonths [2 ] = nextMonth ;
841
847
}
842
848
843
849
// Prepare to calculate positions of each events.
@@ -886,6 +892,13 @@ private void cacheEvent(WeekViewEvent event) {
886
892
mEventRects .add (new EventRect (event , event , null ));
887
893
}
888
894
895
+ private void sortAndCacheEvents (List <WeekViewEvent > events ){
896
+ sortEvents (events );
897
+ for (WeekViewEvent event : events ){
898
+ cacheEvent (event );
899
+ }
900
+ }
901
+
889
902
/**
890
903
* Sorts the events in ascending order.
891
904
* @param events The events to be sorted.
@@ -1014,37 +1027,6 @@ private boolean isTimeAfterOrEquals(Calendar time1, Calendar time2) {
1014
1027
return !(time1 == null || time2 == null ) && time1 .getTimeInMillis () >= time2 .getTimeInMillis ();
1015
1028
}
1016
1029
1017
- /**
1018
- * Deletes the events of the months that are too far away from the current month.
1019
- * @param currentDay The current day.
1020
- */
1021
- private void deleteFarMonths (Calendar currentDay ) {
1022
-
1023
- if (mEventRects == null ) return ;
1024
-
1025
- Calendar nextMonth = (Calendar ) currentDay .clone ();
1026
- nextMonth .add (Calendar .MONTH , 1 );
1027
- nextMonth .set (Calendar .DAY_OF_MONTH , nextMonth .getActualMaximum (Calendar .DAY_OF_MONTH ));
1028
- nextMonth .set (Calendar .HOUR_OF_DAY , 12 );
1029
- nextMonth .set (Calendar .MINUTE , 59 );
1030
- nextMonth .set (Calendar .SECOND , 59 );
1031
-
1032
- Calendar prevMonth = (Calendar ) currentDay .clone ();
1033
- prevMonth .add (Calendar .MONTH , -1 );
1034
- prevMonth .set (Calendar .DAY_OF_MONTH , 1 );
1035
- prevMonth .set (Calendar .HOUR_OF_DAY , 0 );
1036
- prevMonth .set (Calendar .MINUTE , 0 );
1037
- prevMonth .set (Calendar .SECOND , 0 );
1038
-
1039
- List <EventRect > newEvents = new ArrayList <EventRect >();
1040
- for (EventRect eventRect : mEventRects ) {
1041
- boolean isFarMonth = eventRect .event .getStartTime ().getTimeInMillis () > nextMonth .getTimeInMillis () || eventRect .event .getEndTime ().getTimeInMillis () < prevMonth .getTimeInMillis ();
1042
- if (!isFarMonth ) newEvents .add (eventRect );
1043
- }
1044
- mEventRects .clear ();
1045
- mEventRects .addAll (newEvents );
1046
- }
1047
-
1048
1030
@ Override
1049
1031
public void invalidate () {
1050
1032
super .invalidate ();
@@ -1068,11 +1050,21 @@ public EventClickListener getEventClickListener() {
1068
1050
}
1069
1051
1070
1052
public MonthChangeListener getMonthChangeListener () {
1071
- return mMonthChangeListener ;
1053
+ if (mWeekViewLoader instanceof MonthLoader )
1054
+ return ((MonthLoader ) mWeekViewLoader ).getOnMonthChangeListener ();
1055
+ return null ;
1072
1056
}
1073
1057
1074
1058
public void setMonthChangeListener (MonthChangeListener monthChangeListener ) {
1075
- this .mMonthChangeListener = monthChangeListener ;
1059
+ this .mWeekViewLoader = new MonthLoader (monthChangeListener );
1060
+ }
1061
+
1062
+ public WeekViewLoader getWeekViewLoader (){
1063
+ return mWeekViewLoader ;
1064
+ }
1065
+
1066
+ public void setWeekViewLoader (WeekViewLoader loader ){
1067
+ this .mWeekViewLoader = loader ;
1076
1068
}
1077
1069
1078
1070
public EventLongPressListener getEventLongPressListener () {
0 commit comments