Android项目实战(二十九):酒店预定日期选择

本文介绍了一个Android项目实战案例,涉及如何实现酒店预定的日期选择功能。通过展示需求、难点和技术储备,详细阐述了实现思路,包括外部和内部RecyclerView的使用,以及点击事件处理和背景颜色的动态显示。同时,提到了关键代码实现,如数据源初始化、适配器的创建和日期判断逻辑。最后,提供了资源文件的相关代码。
摘要由CSDN通过智能技术生成

先看需求效果图:

     

 

几个需求点:

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;
    }
}
MonthTimeEntity.java

(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;
    }


}
DayTimeEntity.java

(3)、更新类,用于选择 “开始日期”、“结束日期”之后的刷新适配器操作

/**
 * Created by xqx on 2017/1/17.
 * 用于EventBus发送消息
 */
public class UpdataCalendar {
}
UpdataCalendar.java

 

 

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
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值