更新了项目,适合按月渲染打卡记录(使用看使用技巧):calendarview.zip-互联网文档类资源-CSDN下载
项目地址(打卡记录要初始化前一次全部渲染出来): CalendarView.zip_CalendarView-互联网文档类资源-CSDN下载
日历实现查看打卡记录功能:
功能:
- 1、支持农历、节气、常用节假日
- 2、日期范围设置,默认支持的最大日期范围[1900.1~2049.12]
- 3、禁用日期范围设置
- 4、初始化选中单个或多个日期
- 5、单选、多选操作
- 6、跳转到指定日期
- 7、替换农历为指定文字
- 8、通过自定义属性定制日期外观,以及简单的日期item布局配置
- 9、新增查看打卡记录功能;(在原来基础上新增了查看打卡记录功能,包含打卡正常和打卡异常)
预览:
基本用法:
注意:日历使用了viewpager进行了每月的详情展示,viewpager会预加载相邻页面(calendarView.setOffscreenPageLimit(0)),我是每月的打卡记录请求接口获取,viewpager这种预加载会造成打卡记录的圆点的渲染失败,所以我就自定义了viewpager和PagerAdapter,主要是为了禁止预加载,以及禁用了viewpager的侧向滑动功能,只能通过顶部选择年月后去请求接口,然后渲染打卡记录的圆点(已经重写了viewpager和pageradapter的项目已经上传平台:calendarview.zip-互联网文档类资源-CSDN下载);
使用技巧:
设置一个boolean判断是否是日历初始化 private boolean isCalendarInit = false;
HashMap<String, String> clockStatusMap = new HashMap<>();//日历中需要渲染的日期集合
clockStatusMap .put("2020.7.11", "true"); 2020年7月11日 true-打卡正常,灰色点 ,默认就是正常,可不填,7月不能用07月
calendarView.setClockInStatus(clockStatusMap);//接口获取当月的打卡记录集合,处理数据后放入日历
if (!isCalendarInit) {//第一次初始化日历,一定要等把打卡记录放到日历集合后进行初始化,不然会造成渲染失败
isCalendarInit = true;
calendarView
.setStartEndDate("2016.1", "2028.12")
.setDisableStartEndDate("2016.1.1", "2028.12.31")
.setInitDate(cDate[0] + "." + cDate[1])
.setSingleDate(cDate[0] + "." + cDate[1] + "." + cDate[2])
.init();
} else {//已经完成初始化后,选择年月,日历去切换年月并进行渲染
calendarView.toDestDate(Integer.parseInt(year), Integer.parseInt(month), 0);
}
详细的使用方法见下面:
Step 1. 添加JitPack仓库 在当前项目等根目录下的 build.gradle
文件中添加如下内容:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Step 2. 添加项目依赖(在源码基础上进行了扩展,需要直接把源码放到本地添加依赖)
下载项目到本地:
添加依赖到你的项目:
Step 3. 在布局文件中添加WeekView、CalendarView
<com.othershe.calendarview.weiget.WeekView
android:layout_width="match_parent"
android:layout_height="35dp" />
<com.othershe.calendarview.weiget.CalendarView
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="220dp" />
Step 4. 相关初始化
CalendarView calendarView = (CalendarView) findViewById(R.id.calendar);
//日历init,年月日之间用点号隔开
calendarView
.setStartEndDate("2010.7", "2018.12")
.setInitDate("2017.11")
.setSingleDate("2017.12.12")
.init();
//月份切换回调
calendarView.setOnPagerChangeListener(new OnPagerChangeListener() {
@Override
public void onPagerChanged(int[] date) {
}
});
//单选回调
calendarView.setOnItemClickListener(new OnMonthItemClickListener() {
@Override
public void onMonthItemClick(View view, DateBean date) {
}
});
CalendarView相关方法
新增方法 setClockInStatus(HashMap<String, String> map)
{设置日历的打卡状态 例如:
HashMap<String, String> map = new HashMap<>();
map.put("2020.7.11", "true"); 2020年7月11日 true-打卡正常,灰色点 ,默认就是正常,可不填
map.put("2020.7.6", "false"); 2020年7月6日 false-打卡异常,红色点 ,默认就是正常,可不填
//map中没有增加的日期,默认没有打卡
calendarView.setClockInStatus(map);
}
方法名 | 描述 |
---|---|
setInitDate(String date) | 设置日历的初始显示年月 |
setStartEndDate(String startDate, String endDate) | 设置日历开始、结束年月 |
setDisableStartEndDate(String startDate, String endDate) | 设置日历的禁用日期范围(小于startDate、大于endDate禁用) |
setSpecifyMap(HashMap<String, String> map) | 将显示农历的区域替换成指定文字 |
setSingleDate(String date) | 设置单选时初始选中的日期(不设置则不默认选中) |
getSingleDate() | 得到单选时选中的日期 |
setMultiDate(List dates) | 设置多选时默认选中的日期集合 |
getMultiDate() | 得到多选时选中的全部日期 |
toSpecifyDate(int year, int month, int day) | 单选时跳转到指定年月日 |
setOnCalendarViewAdapter(int layoutId, CalendarViewAdapter adapter) | 设置自定义日期item样式 |
init() | 日期初始化(以上属性配置完后调用) |
setOnPagerChangeListener(OnPagerChangeListener listener) | 设置月份切换回调 |
setOnSingleChooseListener(OnSingleChooseListener listener) | 设置单选回调 |
setOnMultiChooseListener(OnMultiChooseListener listener) | 设置多选回调 |
today() | 单选时跳转到今天 |
nextMonth() | 跳转到下个月 |
lastMonth() | 跳转到上个月 |
nextYear() | 跳转到下一年的当前月 |
lastYear() | 跳转到上一年的当前月 |
toStart() | 跳转到日历的开始年月 |
toEnd() | 跳转到日历的结束年月 |
CalendarUtil.getCurrentDate() | 获得当前日期(今天) |
CalendarView的自定义属性
namespace:xmlns:calendarview="http://schemas.android.com/apk/res-auto"
属性名 | 格式 | 描述 | 默认值 |
---|---|---|---|
choose_type | enum | 设置单选(single)、多选(multi) | single |
show_lunar | boolean | 是否显示农历 | true |
show_last_next | boolean | 是否在MonthView显示上月和下月日期 | true |
show_holiday | boolean | 是否显示节假日 | true |
show_term | boolean | 是否显示节气 | true |
switch_choose | boolean | 单选时切换月份,是否选中上次的日期 | true |
solar_color | color | 阳历日期的颜色 | |
solar_size | integer | 阳历的日期尺寸 | 14 |
lunar_color | color | 农历的日期颜色 | |
lunar_size | integer | 农历的日期尺寸 | 8 |
holiday_color | color | 节假日、节气的颜色 | |
choose_color | color | 选中的日期颜色 | |
day_bg | reference | 选中的日期背景(图片) |
WeekView的自定义属性
namespace:xmlns:weekview="http://schemas.android.com/apk/res-auto"
属性名 | 格式 | 描述 | 默认值 |
---|---|---|---|
week_str | string | 周的表示形式,用点隔开(例如:日.一.二.三.四.五.六) | |
week_color | color | 周的颜色 | |
week_size | integer | 周的尺寸 | 12 |