Android制作天气预报 —— 日历查看

日历查看功能默认显示当前年月日,其中当天日期为灰底黑字标明,本月其他日期为白色字体显示,非本月日期以灰色字体显示。用户可通过点击相关按键或者左右滑动实现翻动日历效果。具体操作流程如图所示

实现日历功能先创建新类DayBean用来储存每天的信息,代码如图3-27所示。

图 3- 27 DayBean

之后自定义一个适配器,用于在界面显示日历信息。新建一个类DayAdapter继承于BaseAdapter,代码如图3-28所示。

图 3- 28 DayAdapte

在该适配器中getView()是主要函数,它管理着日历界面信息显示方式,具体实现方式如图3-29所示。

图 3- 29 getView()

扫描二维码关注公众号,回复: 16872114 查看本文章

完成以上两个类的创建之后对日历界面activity_day进行设计。由于ListView是单列多行的显示方式,这种特点对显示城市信息有用,但对显示日历并不友好。所以布局中日历采用的是可以多行多列以网状形式显示的GridView。布局完成后新建类Day,在其中将与日历相关的设计联系起来,代码如图3-30所示。

图 3- 30 Day

updateAdapter()是日历信息显示的关键。设计中日历显示方式是6行7列,共显示42个日期,也就是说,日历显示的不仅是当前月的信息,还有上个月和下个月的部分日期。将各月的各日期放入日历中各自的位置便是updateAdapter()要实现的。

在日历中存在一些临界问题,比如12月之后该是1月等,为了确保设计的日历符合常理,设计中使用常用的日历对象Calendar,以此到达动态设置时间,有效解决临界问题。

在updateAdapter()中先用setCurrentData()将当前时间作为初始时间,之后用set()知道当前月1号为星期几。此时星期的索引是1—7,分别对应星期天、星期一到六,为了方便操作,这里将获得的索引号减一,从而使得0—6分别对应星期天、星期一到六。如图3-31。

图 3- 31 updateAdapter()起始部分

之后开始查询上个月中会有几天和本月日期一起显示。如图3-32所示。

图 3- 32 updateAdapter()查询上月信息

首先set()将日期设为上个月,由于在Calendar中月份返回的是0—11,分别对应1—12月,其他信息返回值和实际情况相符,所以在使用月份的索引号时不同情况不同处理。在这里,get()返回本月索引号之后要减一得到的才是上个月对应的索引号。举个例子,如果本月是11月,那么它返回得到的索引号是10,索引号减一变成9,按照Calendar对象的规则来说,索引号9对应的便是10月,也就是本月的上一月。

然后用将上个月所属的月份、年传给自定义的getMonth()得到上个月的天数。这里面由于上一步已经将时间设置为上个月时间,所以get()再返回的是上个月的索引号,按照规则此时号加一才是上个月月份实际数字。继续之前的例子来说,在此处就是在set()之后当前月变为10月,它的索引号为9。而调用getMonth()需要传的是月份数10不是其索引号9,所以要get()得索引号后加一。

最后,确定本月1号所在星期位置以及上个月天数之后用for循环将上个月最后的几天一一对应本月1号之前的位置,直至填满。这里需要使用之前设置的用于储存信息的DayBean类,将上个月中会出现在本月日历的日期信息一一存入bean,最后将bean存入dataList。

得到与本月一起显示的上个月日期之后,开始将本月日期与日历中位置对应。如图3-33所示。

图 3- 33 updateAdapter()查询本月信息

首先set()将时间设置回当前月份,之前查询上个月信息时已经将月份设为上个月,所以get()返回的索引号再加一才是当前月份的索引号。之后调用getMonth()获取本月天数,其中get()此时得到的索引号时本月对应的索引号了,所以加一即为本月月份数。接下来的操作和查询上月日期的相似,只是在此步中需要调用getFormatTime()分别获取现实中的年月日信息nowDate和软件中日历目前显示的年月信息selectData,接着比较现实中的年月和软件中显示的年月是否相同,相同说明软件目前显示的信息中,有一天是现实生活中正处于的这一天,此时setCurrentDay()参数为true。补充说明一下,setCurrentDay()、setCurrentMonth()均是DayBean类中设置的函数,通过给它们传递true、false来判断正在处理的日期是不是现实生活中正处在的月、日。最终日历中本月本日、本月其他日、非本月日期的显示方式采用哪种便是由它俩确定。

通过以上操作确定日历中上个月和本个月的相关信息,剩余的日期空位用下个月的日期填补,具体操作和查询上个月时候的相似,需要注意的是规则中月份数与索引号之间的关系以及为方便操作对星期索引号的改变,具体如图3-34所示。

图 3- 34 updateAdapter()查询下个月信息

以上三个查询内容结束后使用notifyDataSetChanged()通知Day的适配器initAdapter()更新数据,并在用set()将日期设为当前月。如图3-35所示。

图 3- 35 updateAdapter()结束部分

以上便是updateAdapter()控制日历信息显示的实现方式,里面涉及到的其他定义在Day中的函数如图3-36所示。

图 3- 36 Day中其余函数

猜你喜欢

转载自blog.csdn.net/weixin_58963766/article/details/130567736