先看需求效果图:
几个需求点:
1、显示当月以及下个月的日历 (可自行拓展更多月份)
2、首次点击选择“开始日期”,再次点击选择"结束日期"
(1)、如果“开始日期” “结束日期” 相同
(2)、如果“开始日期” “结束日期” 不同,且“结束日期” 晚于 “开始日期”
(3)、如果“结束日期” 早于 “开始日期” ,重置当前 日期 为 “开始日期”
3、选择的“开始日期” “结束日期” 显示在
难点:
1、 获取当月以及下个月的日历,一个月多少天,每天星期几
2、 判断每个日子的点 与 “开始日期” “结束日期” 的关系,用于显示背景色
技术储备:
1、浅谈RecyclerView(完美替代ListView,GridView)
2、Android项目实战(十三):浅谈EventBus
-----------------------------------------------------------------------------------------------------------------------
实现思路:
1、一个外部RecyclerView 用于显示 日历,每一个item 都用于显示一个月的日历 ,下面都称为 外部RecyclerView
2、外部RecyclerView的每一个Item 内再用一个RecyclerView显示该月的所有日期,每一天都是一个item ,下面都称为 内部RecyclerView
3、点击内部RecyclerView的item 日期,添加监听事件,根据是否开始、结束、中间日期来显示 相应的选中背景
代码实现:
1、代码框架总览
2、实体类
(1)、月份类,外部RecyclerView的数据源实体类
/** * Created by xqx on 2017/1/17. * 代表日历上的每一个月份 */ public class MonthTimeEntity { private int year; //该月份 属于哪一年 private int month; // 该月 是哪一个月份 public MonthTimeEntity(int year, int month) { this.year = year; this.month = month; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } }
(2)、日期类,内部RecyclerView的数据源实体类
/** * Created by xqx on 2017/1/17. * 日历中每一个月中的 每一个天数 */ public class DayTimeEntity { private int day ; //日期,几号 private int month; //属于的月份 private int year; //属于的年份 private int monthPosition; //属于的月份位置,注意是该日期属于的月份在外层列表中的position,不是月份 private int dayPosition; //属于的日期位置,注意是该日期在每个月(内层列表)中的位置 public DayTimeEntity(int day, int month, int year, int monthPosition) { this.day = day; this.month = month; this.year = year; this.monthPosition = monthPosition; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonthPosition() { return monthPosition; } public void setMonthPosition(int monthPosition) { this.monthPosition = monthPosition; } public int getDayPosition() { return dayPosition; } public void setDayPosition(int dayPosition) { this.dayPosition = dayPosition; } }
(3)、更新类,用于选择 “开始日期”、“结束日期”之后的刷新适配器操作
/** * Created by xqx on 2017/1/17. * 用于EventBus发送消息 */ public class UpdataCalendar { }
3、主要实现
(1)、主界面布局
上面就是普通的布局形式,日历用一个RecyclerView显示,这个列表的每一个item都用于显示一个月份的所有天数
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!--标题栏--> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" android:background="@color/white" > <!--标题--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="预定日期" android:layout_centerInParent="true" android:textSize="20sp" /> </RelativeLayout> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:background="#d9d9d9" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#f2f4f7" android:paddingTop="20dp" > <TextView android:id="@+id/plan_time_txt_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始\n时间" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="87dp" android:layout_marginStart="87dp" android:background="@mipmap/bg_white_circle" android:gravity="center" /> <TextView android:id="@+id/plan_time_txt_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="结束\n时间" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_marginRight="74dp" android:layout_marginEnd="74dp" android:background="@mipmap/bg_white_circle" android:gravity="center"/> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:backg