android 日历选择器(酒店专用)
日历选择器
由于公司需求,参看了各个平台的酒店日历选择功能,手动写了一个,就当记录下,代码逻辑可能还需要再去优化下,各位小伙伴没思路的可以参考下。。接下来正题。
看下实现后效果图吧。。
布局上是RecyclerView嵌套RecyclerView,上面2018年月9月是通过自定义RecyclerView.ItemDecoration绘制,代码下面地址有,这里就不解说自定义RecyclerView.ItemDecoration了。。。
((DefaultItemAnimator) mBinding.rv.getItemAnimator()).setSupportsChangeAnimations(false);//当前日期转dateSimpleDateFormat ymd_sdf=new SimpleDateFormat("yyyy-MM-dd");try {if(currentDate==null){new Throwable("please set one start time");return;}mSetDate = ymd_sdf.parse(currentDate);} catch (ParseException e) {e.printStackTrace();}//修改日历对象的日期Calendar c = Calendar.getInstance();c.setTime(mSetDate);//获取月份 月份是从0开始需要+1int firstM= c.get(Calendar.MONTH)+1;//日期int days=c.get(Calendar.DATE);//周几int week=c.get(Calendar.DAY_OF_WEEK);//获取当前这个月最大天数int maxDys=c.getActualMaximum(Calendar.DAY_OF_MONTH);int startDate=0;//日 一 二 三 四 五 六//- - 当前//需要求上周末的日期(周末到周一的日期)填补if("1".equals(week+"")){//今天是否周末startDate=days;}else {//获取上周末startDate= Integer.parseInt(CalendarUtil.getPreviousWeekSundayByDate(ymd_sdf.format(mSetDate)).split("-")[2]);}DateInfo info = new DateInfo();List<DayInfo> dayList=new ArrayList<>();info.setDate(c.get(Calendar.YEAR)+ "年" + firstM + "月");//根据周末日期开始计算到结尾日期的天数//当小于当前日期时,是不可选,setEnable(false)//如果上周末是大于当前的,说明上周末是上个月的//如何判断呢,1,当前日期小于周末则是上个月 2,其他情况是当前日期肯定会大于周末if(days<startDate){//计算上个月在本周日历的日期//获取上月最后一天的日期String previousMonthLastDate=CalendarUtil.getPreviousMonthEndByDate(ymd_sdf.format(mSetDate));int previousMonthLastDay= Integer.parseInt(previousMonthLastDate.split("-")[2]);LogUtil.debugE("previousMonthLastDay",previousMonthLastDay+"");//从上个月周日日期算起,到上个月最后一天的日期for (int i=startDate;i<=previousMonthLastDay;i++){DayInfo dayInfo=new DayInfo() ;dayInfo.setName(i+"");dayInfo.setEnable(false);dayInfo.setDate(previousMonthLastDate.split("-")[0]+"-"+previousMonthLastDate.split("-")[1]);dayList.add(dayInfo);}//计算完后,回归为1号,计算当前这个月日期startDate=1;}//计算当前月的天数for (int i=startDate ; i<=maxDys;i++){DayInfo dayInfo=new DayInfo() ;dayInfo.setName(i+"");dayInfo.setDate(c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)+1)+"-"+i);int c_year= Integer.parseInt(currentDate.split("-")[0]);int c_month= Integer.parseInt(currentDate.split("-")[1]);int c_day= Integer.parseInt(currentDate.split("-")[2]);if(c_year==c.get(Calendar.YEAR) && c_month==(c.get(Calendar.MONTH)+1) && c_day==i){dayInfo.setName("今天");c_stratChildPosition=dayList.size();}if(c_year==c.get(Calendar.YEAR) && c_month==(c.get(Calendar.MONTH)+1) && c_day+1==i){dayInfo.setName("明天");}if(i<days){dayInfo.setEnable(false);}else {dayInfo.setEnable(true);}dayList.add(dayInfo);}info.setList(dayList);mList.add(info);
以上是计算当前月的日历表,currentDate是从服务器拉取的时间,这里我们可以模仿下,设定一个日期yyyy-MM-dd,获取Calendar对象,设置时间为currentDate。以周日-周六为标准。首先理清下 ,计算第一个周末是上个月的周日还是本月的周日,如果是上个月周末,我们需要获取上个周日的日期和上个月最后一个月的最后一天日期,计算相差的日期。如果第一个周日是本月,则当前日期肯定大于上周日的日期。
//获取下3个月的数据for (int i=1 ;i<8;i++){//当前月份循环加1c.add(Calendar.MONTH,01);DateInfo nextInfo = new DateInfo();List<DayInfo> nextdayList=new ArrayList<>();int maxDays=c.getActualMaximum(Calendar.DAY_OF_MONTH);nextInfo.setDate(c.get(Calendar.YEAR)+ "年" + (c.get(Calendar.MONTH)+1) + "月");//周几int weeks=CalendarUtil.getWeekNoFormat(c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)+1)+"-01")-1;LogUtil.debugE("---",weeks+"");//根据该月的第一天,星期几,填充上个月的空白日期for (int t=0;t<weeks;t++){DayInfo dayInfo=new DayInfo() ;dayInfo.setName("");dayInfo.setEnable(false);dayInfo.setDate("");nextdayList.add(dayInfo);}//该月的所有日期for (int j=0;j<maxDays;j++){DayInfo dayInfo=new DayInfo() ;dayInfo.setName((j+1)+"");dayInfo.setEnable(true);dayInfo.setDate(c.get(Calendar.YEAR)+"-"+(c.get(Calendar.MONTH)+1)+"-"+(j+1));nextdayList.add(dayInfo);}nextInfo.setList(nextdayList);mList.add(nextInfo);LogUtil.debugE("--",c.getActualMaximum(Calendar.DAY_OF_MONTH)+"-"+c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH));}
计算后3个月的日历日期,这部分好算,根据Calendar计算每个月的最大天数。获取每个月的第一天的日期,判断是否是周末,是周末,我们直接new Dayinfo添加,否则的话,我们需要根据第一天计算出周几,往后退到周日的日期,添加空数据。
//设置日历标明今天明天public void setDefaultSelect(){if(c_stratChildPosition==-1)return;String date=mList.get(0).getList().get(c_stratChildPosition).getDate();LogUtil.debugE("zuixina---",date);SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Date curDate=null;try {curDate=sdf.parse(FormatDate(date));} catch (ParseException e) {e.printStackTrace();}if(curDate==null)return;Calendar calendar= Calendar.getInstance();calendar.setTime(curDate);calendar.add(Calendar.DATE,1);int year= Integer.parseInt(date.split("-")[0]);int month= Integer.parseInt(date.split("-")[1]);if(year==calendar.get(Calendar.YEAR) && month==calendar.get(Calendar.MONTH)+1 && c_stratChildPosition<mList.get(0).getList().size()-1){setInit(0,c_stratChildPosition,0,c_stratChildPosition+1);}else {for (int i=0;i<mList.get(1).getList().size();i++){if(!TextUtils.isEmpty(mList.get(1).getList().get(i).getDate())){setInit(0,c_stratChildPosition,1,i);break;}}}LogUtil.debugE("zusixin---",calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)+"-"+calendar.get(Calendar.DATE));//}
该方法根据c_stratChildPosition,这个是currentDate日期在数组列表的位置标识,根据该标识去初始化默认的“今天”“明天”。
大概的计算也就这几个地方,其他的基本都是刷新逻辑,代码里注释也比较详细。可以参考代码来理解。。。。写的不好请多多谅解。。。谢谢各位。
gitlub地址
android 日历选择器(酒店专用)相关推荐
- android 日历翻页动画,Android开源库合集:轻松实现Android动态,炫目:日历效果...
前言: 了解过那种动态,炫目的日历效果吗?你知道是怎么 操作的嘛?是否想过,用UI就可以实现,对,也许你说的对,不过UI只是都是动态效果的一部分.那么今天用Annroid开源库,来告诉你android ...
- 日历控件的android代码,Android日历控件PickTime代码实例
Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...
- android图片选择器框架支持长图,基于RxJava的Android图片选择器. – RxPicker
RxPicker 基于 RxJava 的 Android 图片选择器. 特性 与 RxJava 结合,支持响应式得到选择图片结果 兼容 Android 7.0 自定义 ImageLoader 预览 使 ...
- android 本地日历,Android日历提供商:如何删除自己的本地日历?
我正在学习如何使用Android日历.到目前为止,我能够显示有关现有日历的信息.我也可以创建自己的本地日历 - 测试代码如下: private void createCalendarTest() { ...
- android 日历_适用于Android的十大最佳日历应用
android 日历 Looking for the best calendar apps for Android? You're in the right place! Let's get righ ...
- Android日历视图
In this tutorial, we'll be discussing the Calendar Widget using the CalendarView class in our Androi ...
- Android日历只显示年月,只显示年
Android日历只显示年月 款式如下: public class YearPickerDialog extends DatePickerDialog {public YearPickerDialog ...
- android日历信息获取错误,flutter对android的日历数据相关操作
系统日历 三个不同URL的作用 每个url通过contentProvider能获得对应数据库的访问句柄,所以可以理解三个url对应三个数据库,如果通过一个事件关联3个库呢,下面会详细介绍. 数据库介绍 ...
- android pick file,Materia风格的Android文件选择器:MaterialFilePicker_Android_移动开发
一个Materia风格的Android文件选择器. 打开文件选择器: Intent intent = new Intent(this, com.nbsp.materialfilepicker.ui.F ...
最新文章
- 手动修改网卡接口模式从网桥变为路由
- Gson解析JSON数据中动态未知字段key的方法
- qq数据泄露_如何保护企业移动端的数据安全?
- python创建数据库计算机积极拒绝、无法连接_Python3 请求网页源码 目标计算机积极拒绝,无法连接...
- node mysql await_javascript – node.js async / await与MySQL一起使...
- gephi生成网络关系图_用 NetworkX + Gephi + Nebula Graph 分析lt;权力的游戏gt;人物关系(上)
- 外贸独立站VS第三方平台?
- connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
- No WebApplicationContext found: no ContextLoaderListener registered?
- MOSS搜索的爬网错误【访问被拒绝。请验证默认内容访问账户是否有权访问此库】...
- 传奇新增物品和装备的内观外观及特效Pak文件详解
- 柔性机械臂_机械臂位置控制概述
- Dorado7使用常见问题,不定时持续更新。
- Mac连接Windows共享的老式打印机
- QQ空间花匠免费代码
- VS没有CUDA模块问题
- Improved Techniques for Training GANs 代码执行中的坑 python3.6 tf环境
- python安装百度aip_Python人工智能-基于百度AI接口
- 无缝移植J2ME程序到OPhone平台解决方案
- 输入10个数求其中的最大值。
热门文章
- 基于华为云的人脸识别实验
- 问卷设计必看!这些技巧能让你的问卷更加高效!
- canvas绘制图片,图片变模糊
- 【luogu CF1430C】Numbers on Whiteboard(构造)(推论)
- 桌面计算机图标变黑块,win10桌面图标黑块怎么修复_w10电脑桌面图标变黑如何处理...
- 怎样用一句话把一个人弄哭
- ojdbc6-11.2.0.1.0.jar
- (附源码)计算机毕业设计ssm电影网上购票系统
- 蒙特卡洛法(三)马尔科夫链蒙特卡洛法
- C++中resize函数的用法