[置顶] Aandroid日历Dialog
2016-05-24 14:29
615 查看
Dialog效果图:
我们一步一步来实现上面的效果
第一步:先实现如上图的效果
分析
1.要有一个操作日期的工具类(Utils) 此类主要功能 当前日期月份的最大天数 日期月份的1号数星期几? 日期的上一个月最大天数
2. 通过Utils 获取 lastDates contentDates nextDates 三个日期数据集合
3. 创建GridView实例 显示
lastDates contentDates nextDates 三个日期数据集合
GridViewAdapter 源码如下:
Utils 源码:
我们一步一步来实现上面的效果
第一步:先实现如上图的效果
分析
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-dd private 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; c 4000 ase 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 + ""); } } @Override public int getCount() { return contenDates.size() + nextDates.size() + lastDates.size(); } @Override public 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); } } @Override public long getItemId(int position) { return position; } @Override public 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/01 format.setLenient(false); format.parse(date); } catch (ParseException e) { // e.printStackTrace(); // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 convertSuccess = false; } return convertSuccess; } }到此初始效果已经实现了 .....................
相关文章推荐
- android 工具
- 手机传感器
- (高效开发)Android手机间使用socket进行文件互传实例
- 手把手教你做视频播放器(二)-获取视频信息
- android 控件 调色板 Palette
- IDA 调试 Android 方法及简单的脱壳实现
- Android 应用性能优化综述
- Android的兼容问题
- Android 滑动分析(一)
- Android RSA DES等几种加密算法
- 开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)
- Android悬浮窗口的实现
- Android procrank && dumpsys meminfo使用详解
- Android内存泄漏分析及调试
- 国内优秀Android学习资源
- Android扫描本地音乐文件开发案例分享
- Android RxJava使用介绍(五) RxJava的操作符
- android获取存储根目录
- Android实现沉浸式导航栏实例代码
- Android步进电机