日历选择器

由于公司需求,参看了各个平台的酒店日历选择功能,手动写了一个,就当记录下,代码逻辑可能还需要再去优化下,各位小伙伴没思路的可以参考下。。接下来正题。

看下实现后效果图吧。。

布局上是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 日历选择器(酒店专用)相关推荐

  1. android 日历翻页动画,Android开源库合集:轻松实现Android动态,炫目:日历效果...

    前言: 了解过那种动态,炫目的日历效果吗?你知道是怎么 操作的嘛?是否想过,用UI就可以实现,对,也许你说的对,不过UI只是都是动态效果的一部分.那么今天用Annroid开源库,来告诉你android ...

  2. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  3. android图片选择器框架支持长图,基于RxJava的Android图片选择器. – RxPicker

    RxPicker 基于 RxJava 的 Android 图片选择器. 特性 与 RxJava 结合,支持响应式得到选择图片结果 兼容 Android 7.0 自定义 ImageLoader 预览 使 ...

  4. android 本地日历,Android日历提供商:如何删除自己的本地日历?

    我正在学习如何使用Android日历.到目前为止,我能够显示有关现有日历的信息.我也可以创建自己的本地日历 - 测试代码如下: private void createCalendarTest() { ...

  5. android 日历_适用于Android的十大最佳日历应用

    android 日历 Looking for the best calendar apps for Android? You're in the right place! Let's get righ ...

  6. Android日历视图

    In this tutorial, we'll be discussing the Calendar Widget using the CalendarView class in our Androi ...

  7. Android日历只显示年月,只显示年

    Android日历只显示年月 款式如下: public class YearPickerDialog extends DatePickerDialog {public YearPickerDialog ...

  8. android日历信息获取错误,flutter对android的日历数据相关操作

    系统日历 三个不同URL的作用 每个url通过contentProvider能获得对应数据库的访问句柄,所以可以理解三个url对应三个数据库,如果通过一个事件关联3个库呢,下面会详细介绍. 数据库介绍 ...

  9. android pick file,Materia风格的Android文件选择器:MaterialFilePicker_Android_移动开发

    一个Materia风格的Android文件选择器. 打开文件选择器: Intent intent = new Intent(this, com.nbsp.materialfilepicker.ui.F ...

最新文章

  1. 手动修改网卡接口模式从网桥变为路由
  2. Gson解析JSON数据中动态未知字段key的方法
  3. qq数据泄露_如何保护企业移动端的数据安全?
  4. python创建数据库计算机积极拒绝、无法连接_Python3 请求网页源码 目标计算机积极拒绝,无法连接...
  5. node mysql await_javascript – node.js async / await与MySQL一起使...
  6. gephi生成网络关系图_用 NetworkX + Gephi + Nebula Graph 分析lt;权力的游戏gt;人物关系(上)
  7. 外贸独立站VS第三方平台?
  8. connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
  9. No WebApplicationContext found: no ContextLoaderListener registered?
  10. MOSS搜索的爬网错误【访问被拒绝。请验证默认内容访问账户是否有权访问此库】...
  11. 传奇新增物品和装备的内观外观及特效Pak文件详解
  12. 柔性机械臂_机械臂位置控制概述
  13. Dorado7使用常见问题,不定时持续更新。
  14. Mac连接Windows共享的老式打印机
  15. QQ空间花匠免费代码
  16. VS没有CUDA模块问题
  17. Improved Techniques for Training GANs 代码执行中的坑 python3.6 tf环境
  18. python安装百度aip_Python人工智能-基于百度AI接口
  19. 无缝移植J2ME程序到OPhone平台解决方案
  20. 输入10个数求其中的最大值。

热门文章

  1. 基于华为云的人脸识别实验
  2. 问卷设计必看!这些技巧能让你的问卷更加高效!
  3. canvas绘制图片,图片变模糊
  4. 【luogu CF1430C】Numbers on Whiteboard(构造)(推论)
  5. 桌面计算机图标变黑块,win10桌面图标黑块怎么修复_w10电脑桌面图标变黑如何处理...
  6. 怎样用一句话把一个人弄哭
  7. ojdbc6-11.2.0.1.0.jar
  8. (附源码)计算机毕业设计ssm电影网上购票系统
  9. 蒙特卡洛法(三)马尔科夫链蒙特卡洛法
  10. C++中resize函数的用法