Dialog效果图:

我们一步一步来实现上面的效果

第一步:先实现如上图的效果

分析

1.要有一个操作日期的工具类(Utils)  此类主要功能  当前日期月份的最大天数 日期月份的1号数星期几?  日期的上一个月最大天数

2. 通过Utils 获取 lastDates contentDates nextDates 三个日期数据集合

3. 创建GridView实例 显示 lastDates contentDates nextDates 三个日期数据集合

GridViewAdapter 源码如下:

public class DateGridViewAdapter extends BaseAdapter {public static final String MONDAY = "周一";public static final String TUESDAY = "周二";public static final String WEDNESDAY = "周三";public static final String THURSDAY = "周四";public static final String FRIDAY = "周五";public static final String SATURDAY = "周六";public static final String SUNDAY = "周日";private Context context;private String date;// 日期字符串 日期格式:yyyy-MM-ddprivate int MAXday;// 日期月份一共有多少天private int TopMAXday;// 日期月份上一个月一共有多少天private int ItemCount = 42;// GridView Item个数private ArrayList<String> lastDates;// 当前日期月份之前一个月private ArrayList<String> contenDates;// 当前日期月份private ArrayList<String> nextDates;// 当前日期月份之后一个月/*** @param date*            当传递过来的date为null时 则使用当前时间* @param remindDate*            所需要提醒的时间集合* */public DateGridViewAdapter(Context context, String date) {this.context = context;if (date == null) {this.date = Utils.getDate();} else if (Utils.isValidDate(date)) {this.date = date;}initialization();}/*** 初始化日期数据*/private void initialization() {MAXday = Utils.getDayOfMonth(getDate());TopMAXday = Utils.getTopDayOfMonth(getDate());setData();       }/*** 设置日期数据*/private void setData() {contenDates = new ArrayList<>();nextDates = new ArrayList<>();lastDates = new ArrayList<>();switch (Utils.getWeek(this.date)) {case MONDAY: // 周一addData(lastDates, TopMAXday, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 1);break;case TUESDAY: // 周二addData(lastDates, TopMAXday - 1, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 2);break;case WEDNESDAY:// 周三addData(lastDates, TopMAXday - 2, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 3);break;case THURSDAY:// 周四addData(lastDates, TopMAXday - 3, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 4);break;case FRIDAY:// 周五addData(lastDates, TopMAXday - 4, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 5);break;case SATURDAY:// 周六addData(lastDates, TopMAXday - 5, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 6);break;case SUNDAY:// 周日addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday);break;}}private void addData(ArrayList<String> list, int i, int count) {for (int j = i; j <= count; j++) {list.add(j + "");}}private void addData(ArrayList<String> list, int count) {for (int i = 1; i <= count; i++) {list.add(i + "");}}@Overridepublic int getCount() {return contenDates.size() + nextDates.size() + lastDates.size();}@Overridepublic Object getItem(int position) {if (lastDates.size() != 0 && position < lastDates.size()) {return lastDates.get(position);} else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {return nextDates.get(position);} else {return contenDates.get(position);}}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView tv = null;if (convertView == null) {AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,Utils.dip2px(context, 40));tv = new TextView(context);tv.setLayoutParams(lp);convertView = tv;} else {tv = (TextView) convertView;}    // 上一个月if (lastDates.size() != 0 && position < lastDates.size()) {tv.setTextColor(Color.parseColor("#bfbfbf"));tv.setText(lastDates.get(position));}// 下一个月else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {         tv.setText(nextDates.get(position - lastDates.size() - contenDates.size()));tv.setTextColor(Color.parseColor("#bfbfbf"));}// 当月else {tv.setText(contenDates.get(position - lastDates.size()));tv.setTextColor(Color.parseColor("#000000"));}return tv;}
}

Utils 源码:

public class Utils {public static final int TYPR_NEXT = 0;// 下一个月public static final int TYPR_LAST = 1;// 上一个月/*** 根据手机的分辨率从 px(像素) 的单位 转成为 dp*/public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}/*** 根据手机的分辨率从 dp(像素) 的单位 转成为 px*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** @param date*            日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期月份的1号是星期几?*/public static String getWeek(String date) {Calendar calendar = Calendar.getInstance(Locale.CHINA);calendar.setTime(new Date(getMillisecond(date)));calendar.set(Calendar.DAY_OF_MONTH, 1);SimpleDateFormat format = new SimpleDateFormat("E");return format.format(calendar.getTime());}/*** @return 返回系统当前时间的日期字符串 "年-月-日"*/public static String getDate() {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");return df.format(new Date());}/*** @param date*            根据传入日期字符串 date 传入的日期字符串格式 :"年-月-日"* * @param type*            {@link #TYPR_LAST }上一个月*            <p>*            {@link #TYPR_NEXT}下一个月* * @return 返回下一月或上一个月的日期字符串*/public static String getNewDate(String date, int type) {String formatDate = getDate(getMillisecond(date));String year = formatDate.substring(0, 4);String day = formatDate.substring(8, formatDate.length());String month = formatDate.substring(5, 7);int intYear = Integer.valueOf(year);int intMonth = Integer.valueOf(month);month = "";if (type == TYPR_LAST) {if (intMonth > 1) {month = String.valueOf((intMonth - 1));} else {year = "";month = "12";year = String.valueOf((intYear - 1));}} else {if (intMonth == 12) {year = "";month = "1";year = String.valueOf((intYear + 1));} else {month = String.valueOf((intMonth + 1));}}String NewDate = year + "-" + month + "-" + day;return getDate(getMillisecond(NewDate));}/*** @param date*            日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期上一个月 月份的最大天数** */public static int getTopDayOfMonth(String date) {String NewDate = getNewDate(date, TYPR_LAST);return getDayOfMonth(NewDate);}/*** @param date*            日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期月份的最大天数*/public static int getDayOfMonth(String date) {Calendar aCalendar = Calendar.getInstance(Locale.CHINA);aCalendar.setTime(new Date(getMillisecond(date)));int day = aCalendar.getActualMaximum(Calendar.DATE);return day;}/*** @param date*            日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期的毫秒值*/public static long getMillisecond(String date) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d = null;try {d = sdf.parse(date);} catch (ParseException e) {e.printStackTrace();}return d.getTime();}/*** @param millisecond*            毫秒值* @return 返回一个日期格式为 yyyy-MM-dd 的字符串 "年-月-日"*/public static String getDate(Long millisecond) {DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(millisecond);return formatter.format(calendar.getTime());}/*** @param date*            判断日期格式是否是 yyyy-MM-dd "年-月-日"* @return 如果不是则返回 fase*/public static boolean isValidDate(String date) {boolean convertSuccess = true;SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");try {// 设置lenient为false.// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01format.setLenient(false);format.parse(date);} catch (ParseException e) {// e.printStackTrace();// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对convertSuccess = false;}return convertSuccess;}}

到此初始效果已经实现了 .....................

Aandroid日历Dialog相关推荐

  1. android系统日期对话框只显示年月,android 只显示年月的日历

    这是一篇不完整的文章 希望看到的读者 能够 跟我完善一下 ! 这系统自带的日历 多多少少 会有弊端 ! 手机版本不一样 操作不一样 所以我们在判断隐藏某一部分之前 还要判断api的版本 这是我要达成的 ...

  2. 精心挑选12款优秀的 JavaScript 日历和时间选择插件

    今天这篇文章向大家分享12款精心挑选的优秀 JavaScript 日历和时间选择插件,都带有详细的使用教程和效果演示.这些插件能够帮助 Web 开发人员更快速的实现各种精美的日历和时间选择效果.同时推 ...

  3. python对话框机制_Chromium 新的弹窗机制以及 HTML 的 dialog 元素

    自 1995 年 JavaScript 诞生之初,就包含了 3 个方法 alert().confirm() 和 prompt().在随后的 Chrome 版本中,Chrome 团队一直在修改原生弹窗的 ...

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

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

  5. jQuery插件实战之fullcalendar(日历插件)Demo

    jQuery的插件许多,应用的场景也很丰富,今天我这里给大家介绍一款很有用的日历页面开发插件 - fullcalendar,眼下最新版本号是1.5.1,使用这款插件可以高速帮助你高速编程实现基于web ...

  6. flutter 日历_Flutter:一个更贴近真实项目的练习

    最近 Flutter 火的一塌糊涂,所以今天给大家推荐一个 Flutter 的练习项目.非常的适合入门级学习 Flutter 的开发者. 为什么这么说呢?因为它包含了完整 UI 设计图,更贴近真实项目 ...

  7. 12款优秀的 JavaScript 日历和时间选择控件

    这些插件能够帮助  Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...

  8. html 日历系统 源码,calendar.html

    Full Calendar - Bootstrap后台管理系统模版Ace下载 try{ace.settings.check('navbar' , 'fixed')}catch(e){} Ace Adm ...

  9. 选择时间日历控件DatePickerDialog实现(从外包项目中挖出来整理的)

    直接上源码 Mainactivity.java package cn.xiayiye.canclder;import java.util.Calendar;import android.app.Act ...

最新文章

  1. 用 C# 做组件设计时的事件实现方法讨论
  2. monitor.go
  3. 基于springboot2.5.5自建启动器starter制品库
  4. LeetCode 923. 三数之和的多种可能(双指针)
  5. Chrome浏览器安装vue-devtools插件
  6. 网络编程之 字节序和深入理解bind()函数
  7. vue中使用base64和md5
  8. 算法导论第22章部分答案
  9. Layui表单验证lay-verify属性:自定义校验
  10. Android应用源码之仿墨迹天气插件
  11. 计算机关机界面卡住,Win7关机缓慢,关机后一直卡在正在关机界面
  12. android 桌面快捷方式静态shortcuts异常
  13. 详解变频器、逆变器工作原理
  14. 等效焦距和视场角计算
  15. Microsoft Exchange Server邮箱管理
  16. Linux 流量控制工具 TC 详解
  17. 计算几何基础——【点积和叉积的用处】
  18. 用非上市股权评估的思路看Polkadot估值
  19. 解决FTP文件访问需要输入用户名和密码的问题
  20. 个人以及企业用户如何选择合适的阿里云服务器?

热门文章

  1. 刘海屏之全面屏适配攻略
  2. 闲鱼免费送可以引流吗?比较新式的引流绝佳之处
  3. python读word颜色,Python操作word
  4. dysms_PHP(发短信)
  5. 编程英雄出少年--学编程趁年轻,时不待我,朝气蓬勃的学子们成功与成名在等待着你们
  6. 前端随笔--WEB中播放视频(JS实现)
  7. 其实你可以通过淘宝尽孝心:带你认识淘宝尽孝神器
  8. 南通SEO:单页的SEO元素
  9. 蓝桥杯———数字三角形(JAVA)
  10. Vue集成飞书前端JSSDK