Android日历开发:日历显示需要准备哪些数据

[TOC]

获取特殊日期

节假日

节假日、补休日数据

可以放在本地,不过最后放在服务器动态获取,本地缓存
节假日数据:holidayInfo
休息日数据:defferedInfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static final class HolidayConst {
/**
* 2013年节假日和补休日json,可以放到服务器
*/
public static final String calendar_holiday_2013 = "{\"holidayInfo\":{\"year\":2013,\"day\":[[\"1\",\"2\",\"3\"],[\"9\",\"10\",\"11\",\"12\"," +
"\"13\",\"14\",\"15\"],[\"\"],[\"4\",\"5\",\"6\",\"29\",\"30\"],[\"1\"],[\"10\",\"11\",\"12\"],[\"\"]," +
"[\"\"],[\"19\",\"20\",\"21\"],[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"],[\"\"],[\"\"]]}," +
"\"defferedInfo\":{\"year\":2013,\"day\":[[\"5\",\"6\"],[\"16\",\"17\"],[\"\"],[\"7\",\"27\",\"28\"],[\"\"]," +
"[\"8\",\"9\"],[\"\"],[\"\"],[\"22\",\"29\"],[\"12\"],[\"\"],[\"\"]]}}";
/**
* 2014年节假日和补休日json,可以放到服务器
*/
public static final String calendar_holiday_2014 = "{\"holidayInfo\":{\"year\":2014,\"day\":[[\"1\",\"31\"],[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"]," +
"[\"\"],[\"5\",\"6\",\"7\"],[\"1\",\"2\",\"3\",\"31\"],[\"1\",\"2\"],[\"\"],[\"\"],[\"6\",\"7\",\"8\"]," +
"[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"],[\"\"],[\"\"]]}," +
"\"defferedInfo\":{\"year\":2014,\"day\":[[\"26\"],[\"8\"],[\"\"],[\"\"],[\"4\"],[\"\"],[\"\"],[\"\"],[\"28\"],[\"11\"],[\"\"],[\"\"]]}}";
/**
* 2015年节假日和补休日json,可以放到服务器
*/
public static final String calendar_holiday_2015 = "{\"holidayInfo\":{\"year\":2015,\"day\":[[\"1\",\"2\",\"3\"],[\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\"]," +
"[\"\"],[\"4\",\"5\",\"6\"],[\"1\",\"2\",\"3\",\"31\"],[\"20\",\"21\",\"22\"],[\"\"],[\"\"]," +
"[\"3\",\"4\",\"5\",\"26\",\"27\"],[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"],[\"\"],[\"\"]]}," +
"\"defferedInfo\":{\"year\":2015,\"day\":[[\"4\"],[\"15\",\"16\",\"17\",\"28\"],[\"\"],[\"\"],[\"\"],[\"\"]," +
"[\"\"],[\"\"],[\"6\"],[\"8\",\"9\",\"10\"],[\"\"],[\"\"]]}}";
/**
* 2016年节假日和补休日json,可以放到服务器
*/
public static final String calendar_holiday_2016 = "{\"holidayInfo\":{\"year\":2016,\"day\":[[\"1\",\"2\",\"3\"],[\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\"],[\"\"]," +
"[\"2\",\"3\",\"4\",\"30\"],[\"1\",\"2\"],[\"9\",\"10\",\"11\"],[\"\"],[\"\"],[\"15\",\"16\",\"17\"],[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"],[\"\"]," +
"[\"\"]]},\"defferedInfo\":{\"year\":2016,\"day\":[[\"\"],[\"6\",\"14\"],[\"\"],[\"\"],[\"\"],[\"12\"],[\"\"],[\"\"],[\"18\"],[\"8\",\"9\"],[\"\"],[\"\"]]}}";
/**
* 2017年节假日和补休日json,可以放到服务器
*/
public static final String calendar_holiday_2017 = "{\"holidayInfo\":{\"year\":2017,\"day\":[[\"1\",\"2\",\"27\",\"28\",\"29\",\"30\",\"31\"],[\"1\",\"2\"]," +
"[\"\"],[\"2\",\"3\",\"4\",\"29\",\"30\"],[\"1\",\"28\",\"29\",\"30\"],[\"\"],[\"\"],[\"\"],[\"\"],[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]," +
"[\"\"],[\"\"]]},\"defferedInfo\":{\"year\":2017,\"day\":[[\"22\"],[\"4\"],[\"\"],[\"1\"],[\"27\"],[\"\"],[\"\"],[\"\"],[\"30\"],[\"\"],[\"\"],[\"\"]]}}";
}

获取节假日数据

1 定义数据类型

1
2
3
4
5
6
7
8
@IntDef({HolidayType.HOLIDAY, HolidayType.DEFFERED})
@Retention(RetentionPolicy.SOURCE)
public @interface HolidayType {
//节假日
int HOLIDAY = 1;
//补休日
int DEFFERED = 2;
}

这是一个注解,使用这个注解的变量的值范围需要在@IntDef规定的值当中,如果值不是HolidayType.HOLIDAYHolidayType.DEFFERED,编辑器会提示警告。
@Retention(RetentionPolicy.SOURCE)表示注解只在源码中有效,在编译期失效。

2 获取节假日数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//节假日 年/月/月节假日列表
private SparseArray<SparseArray<List<Integer>>> holidayArray;
//补休日
private SparseArray<SparseArray<List<Integer>>> defferedArray;
public List<Integer> getHoliday(Calendar calendar, @HolidayType int type) {
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
if (year < 2013) return new ArrayList<>();
SparseArray<SparseArray<List<Integer>>> yearArray;
if (type == HolidayType.HOLIDAY) {
yearArray = holidayArray;
} else {
yearArray = defferedArray;
}
if (yearArray == null) {
yearArray = new SparseArray<>();
}
SparseArray<List<Integer>> monthArray = yearArray.get(year);
if (monthArray == null) {
monthArray = new SparseArray<>();
yearArray.put(year, monthArray);
String holiday = getHolidayCache().readStringCache("holiday" + year);
if (TextUtils.isEmpty(holiday)) {
//仍为空
//获取本地类文件定义的
try {
Field field = CalendarConst.HolidayConst.class.getDeclaredField("calendar_holiday_" + year);
if (field != null) {
holiday = field.get(null).toString();
}
} catch (Exception e) {
e.printStackTrace();
}
if(TextUtils.isEmpty(holiday)){
//从网络拉取
//getHolidayCache().putString(CalendarConst.SPElementKey.WEEK_FIRST_DAY, holiday);
}
}
if (!TextUtils.isEmpty(holiday)) {
HolidayInfos holidayInfos = new Gson().fromJson(holiday, HolidayInfos.class);
if (holidayInfos != null) {
HolidayInfo info;
if (type == HolidayType.HOLIDAY) {
info = holidayInfos.getHolidayInfo();
} else {
info = holidayInfos.getDefferedInfo();
}
if (info != null) {
String[][] day = info.getDay();
for (int i = 0; i < day.length; i++) {
List<Integer> list = new ArrayList();
for (int j = 0; j < day[i].length; j++) {
if (TextUtils.isEmpty(day[i][j])) {
continue;
}
try {
list.add(Integer.parseInt(day[i][j]));
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
monthArray.put(i, list);
}
}
}
}
}
if (monthArray != null && monthArray.get(month) != null) {
return monthArray.get(month);
} else {
return new ArrayList<>();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 获取指定年月的节假日数据
*
* @param calendar
* @return 指定月份的节假日期数组
*/
public List<Integer> getHoliday(Calendar calendar) {
return getHoliday(calendar, HolidayType.HOLIDAY);
}
/**
* 获取指定年月的补休日数据
*
* @param calendar
* @return 指定月份的补休日期数组
*/
public List<Integer> getDeffered(Calendar calendar) {
return getHoliday(calendar, HolidayType.DEFFERED);
}

HolidayInfos类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class HolidayInfos {
//补休日
private HolidayInfo defferedInfo;
//节假日
private HolidayInfo holidayInfo;
public HolidayInfo getDefferedInfo() {
return defferedInfo;
}
public void setDefferedInfo(HolidayInfo defferedInfo) {
this.defferedInfo = defferedInfo;
}
public HolidayInfo getHolidayInfo() {
return holidayInfo;
}
public void setHolidayInfo(HolidayInfo holidayInfo) {
this.holidayInfo = holidayInfo;
}
}

HolidayInfo类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class HolidayInfo {
private int year;
private String[][] day;
public int getYear() {
return this.year;
}
public void setYear(int year) {
this.year = year;
}
public String[][] getDay() {
return this.day;
}
public void setDay(String[][] day) {
this.day = day;
}
}

获取周末数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 获取一个月所有的周末
*
* @param calendar
* @param date {@link Calendar#DAY_OF_WEEK}
* @return
*/
public List<Integer> getWeekend(Calendar calendar, int date) {
SparseArray<SparseArray<List<Integer>>> dateArray = null;
if (date == Calendar.SATURDAY) {
dateArray = saturdayArray;
} else if (date == Calendar.SUNDAY) {
dateArray = sundayArray;
}
if (dateArray == null) {
dateArray = new SparseArray<>();
}
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
SparseArray<List<Integer>> monthArray = dateArray.get(year);
if (monthArray == null) {
monthArray = new SparseArray<>();
dateArray.put(year, monthArray);
}
List<Integer> dateList = monthArray.get(month);
if (dateList == null) {
dateList = new ArrayList<>();
Calendar tmpCalendar = Calendar.getInstance();
tmpCalendar.set(year, month, 1, 0, 0, 0);
int tmpMonth;
do {
int day = tmpCalendar.get(Calendar.DAY_OF_WEEK);
if (day == date) {
dateList.add(tmpCalendar.get(Calendar.DATE));
}
tmpCalendar.add(Calendar.DATE, 1);
tmpMonth = tmpCalendar.get(Calendar.MONTH);
} while (tmpMonth == month);
monthArray.put(month, dateList);
}
if (monthArray != null && monthArray.get(month) != null) {
return monthArray.get(month);
} else {
return new ArrayList<>();
}
}

获取一个月的数据

日期实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
* 日期实体类
*/
public class DayInfo {
private int year = 0, month = 0, day = 0;
private Calendar calendar = Calendar.getInstance();
//节假日,补休日
private boolean isHoliday = false, isDeferred = false;
//今天,周六,周日
private boolean isToday = false, isSaturday = false, isSunday;
public DayInfo() {
}
public DayInfo(Calendar calendar) {
this.year = calendar.get(Calendar.YEAR);
this.month = calendar.get(Calendar.MONTH);
this.day = calendar.get(Calendar.DATE);
this.calendar.set(year, month, day, 0, 0, 0);
this.calendar.set(Calendar.MILLISECOND, 0);
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public boolean isHoliday() {
return isHoliday;
}
public void setHoliday(boolean holiday) {
isHoliday = holiday;
}
public boolean isToday() {
return isToday;
}
public void setToday(boolean today) {
isToday = today;
}
public boolean isSaturday() {
return isSaturday;
}
public void setSaturday(boolean saturday) {
isSaturday = saturday;
}
public boolean isSunday() {
return isSunday;
}
public void setSunday(boolean sunday) {
isSunday = sunday;
}
public boolean isDeferred() {
return isDeferred;
}
public void setDeferred(boolean deferred) {
isDeferred = deferred;
}
public Calendar getCalendar() {
return calendar;
}
public void setCalendar(Calendar calendar) {
this.calendar = calendar;
}
}

获取一周的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 获取传入周首日所在周的数据
*
* @param calendar 周首日
* @return
*/
public List<DayInfo> buildWeekDayInfoList(Calendar calendar) {
List<DayInfo> dayInfoList = new ArrayList<>();
for (int j = 0; j < 7; j++) {
DayInfo dayInfo = new DayInfo(calendar);
//节假日
if (getHoliday(calendar).contains(dayInfo.getDay())) {
dayInfo.setHoliday(true);
}
//补休日
if (getDeffered(calendar).contains(dayInfo.getDay())) {
dayInfo.setDeferred(true);
}
//周六
if (getWeekend(calendar, Calendar.SATURDAY).contains(dayInfo.getDay())) {
dayInfo.setSaturday(true);
}
//周日
if (getWeekend(calendar, Calendar.SUNDAY).contains(dayInfo.getDay())) {
dayInfo.setSunday(true);
}
//今天
if (TimeUtils.isToday(calendar)) {
dayInfo.setToday(true);
}
dayInfoList.add(dayInfo);
calendar.add(Calendar.DATE, 1);
}
return dayInfoList;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private SparseArray<SparseArray<List<DayInfo>>> weekDayInfoArray;
/**
* 获取一周的日期数据
*
* @param calendar
* @return
*/
public List<DayInfo> getWeekDayInfoList(Calendar calendar) {
Calendar tmpCalendar = TimeUtils.copyCalendar(calendar);
int firstDay = getWeekFirstDay();
if (firstDay == Calendar.SUNDAY) {
TimeUtils.setToSunday(tmpCalendar, true);
} else {
TimeUtils.setToMonday(tmpCalendar, false);
}
int year = tmpCalendar.get(Calendar.YEAR);
int week = tmpCalendar.get(Calendar.WEEK_OF_YEAR);
if (weekDayInfoArray == null) {
weekDayInfoArray = new SparseArray<>();
}
SparseArray<List<DayInfo>> weekArray = weekDayInfoArray.get(year);
if (weekArray == null) {
weekArray = new SparseArray<>();
weekDayInfoArray.put(year, weekArray);
}
List<DayInfo> dayInfoList = weekArray.get(week);
if (dayInfoList == null) {
dayInfoList = buildWeekDayInfoList(tmpCalendar);
weekArray.put(week, dayInfoList);
}
return dayInfoList;
}
/**
* 获取周首日
*
* @return
*/
public int getWeekFirstDay() {
return SPUtils.create(mContext, CalendarConst.SPFileName.CALENDAR_SETTING)
.getInt(CalendarConst.SPElementKey.WEEK_FIRST_DAY, Calendar.MONDAY);
}

周首日通过本地SharedPreferences存储。

获取一个月的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 构建日历中一页各天的信息数组,第一行和最后一行可能包含上个月的信息
*
* @param calendar
* @return
*/
public List<DayInfo> buildMonthDayInfoList(Calendar calendar) {
Calendar tmpCalendar = TimeUtils.copyCalendar(calendar);
List<DayInfo> dayInfoList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
dayInfoList.addAll(getWeekDayInfoList(tmpCalendar));
tmpCalendar.add(Calendar.DATE, 7);
}
return dayInfoList;
}
private SparseArray<SparseArray<List<DayInfo>>> monthDayInfoArray;
/**
* 获取一个日历视图日期(42天)的数组,先从缓存中获取,如果没有就建立
*
* @param calendar 日历当前选中的日期
* @return
*/
public List<DayInfo> getMonthDayInfoList(Calendar calendar) {
//各个月的数据,HashMap<year_month,DayInfo[][]
Calendar tmpCalendar = getMonthPeriod(calendar)[0];
//考勤日所在年
int year = tmpCalendar.get(Calendar.YEAR);
//考勤日所在月
int month = tmpCalendar.get(Calendar.MONTH);
if (monthDayInfoArray == null) {
monthDayInfoArray = new SparseArray<>();
}
//一个月的数据
SparseArray<List<DayInfo>> monthArray = monthDayInfoArray.get(year);
if (monthArray == null) {
monthArray = new SparseArray<>();
monthDayInfoArray.put(year, monthArray);
}
List<DayInfo> dayInfoList = monthArray.get(month);
if (dayInfoList == null) {
dayInfoList = buildMonthDayInfoList(tmpCalendar);
monthArray.put(month, dayInfoList);
}
return dayInfoList;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static int monthFirstDay = 1;
/**
* 设置月第一天
*
* @param monthFirstDay
*/
public static void setMonthFirstDay(int monthFirstDay) {
CalendarDataCenter.monthFirstDay = monthFirstDay;
}
/**
* 获取一个月的周期
*
* @param calendarSelected
* @return 假设1号是月第一天,现在是5月,那么返回的是[5月1日0点,6月1日0点]
*/
public static Calendar[] getMonthPeriod(Calendar calendarSelected) {
Calendar tmpCalendar = TimeUtils.copyCalendar(calendarSelected);
Calendar calendar1 = TimeUtils.copyCalendar(calendarSelected);
Calendar calendar2 = TimeUtils.copyCalendar(calendarSelected);
if (calendarSelected.get(Calendar.DATE) < monthFirstDay) {
tmpCalendar.add(Calendar.MONTH, -1);
}
calendar1.set(tmpCalendar.get(Calendar.YEAR),
tmpCalendar.get(Calendar.MONTH),
monthFirstDay,
0, 0, 0);
//注意必须设毫秒,日历等很多地方都是按毫秒存数据
calendar1.set(Calendar.MILLISECOND, 0);
calendar2.setTimeInMillis(calendar1.getTimeInMillis());
calendar2.add(Calendar.MONTH, 1);
return new Calendar[]{calendar1, calendar2};
}

Github地址:https://github.com/Jadyli/SanchiCalendar/blob/master/calendar/src/main/java/com/jady/calendar/model/data/CalendarDataCenter.java

数据准备完成。

如果您觉得这篇文章不错,可以打赏支持下哦,谢谢