分类:
版权声明:本文为博主原创文章,未经博主允许不得转载。
最近无聊在做一个项目,需要用到日历。日历并不需要太复杂,只需要能够简单的查看就行,所以我选用了java提供的Calendar类,和安卓的gridView组合的形式.
先看效果图:
背景什么的先不要管他。只看主体部分,左箭头查看上个月的,右箭头查看下个月的.
接下来开始我们的日历。
首先,需要使用Calendar自己构造一个DateUtils类,这个相当简单。
- import java.util.Calendar;
- /**
- * Created by 91905 on 2016/8/22 0022.
- */
- public class DateUtils {
- /**
- * 获取当前年份
- *
- * @return
- */
- public static int getYear() {
- return Calendar.getInstance().get(Calendar.YEAR);
- }
- /**
- * 获取当前月份
- *
- * @return
- */
- public static int getMonth() {
- return Calendar.getInstance().get(Calendar.MONTH) + 1;
- }
- /**
- * 获取当前日期是该月的第几天
- *
- * @return
- */
- public static int getCurrentDayOfMonth() {
- return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
- }
- /**
- * 获取当前日期是该周的第几天
- *
- * @return
- */
- public static int getCurrentDayOfWeek() {
- return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
- }
- /**
- * 获取当前是几点
- */
- public static int getHour() {
- return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);//二十四小时制
- }
- /**
- * 获取当前是几分
- *
- * @return
- */
- public static int getMinute() {
- return Calendar.getInstance().get(Calendar.MINUTE);
- }
- /**
- * 获取当前秒
- *
- * @return
- */
- public static int getSecond() {
- return Calendar.getInstance().get(Calendar.SECOND);
- }
- /**
- * 根据传入的年份和月份,获取当前月份的日历分布
- *
- * @param year
- * @param month
- * @return
- */
- public static int[][] getDayOfMonthFormat(int year, int month) {
- Calendar calendar = Calendar.getInstance();
- calendar.set(year, month - 1, 1);//设置时间为每月的第一天
- //设置日历格式数组,6行7列
- int days[][] = new int[6][7];
- //设置该月的第一天是周几
- int daysOfFirstWeek = calendar.get(Calendar.DAY_OF_WEEK);
- //设置本月有多少天
- int daysOfMonth = getDaysOfMonth(year, month);
- //设置上个月有多少天
- int daysOfLastMonth = getLastDaysOfMonth(year, month);
- int dayNum = 1;
- int nextDayNum = 1;
- //将日期格式填充数组
- for (int i = 0; i < days.length; i++) {
- for (int j = 0; j < days[i].length; j++) {
- if (i == 0 && j < daysOfFirstWeek - 1) {
- days[i][j] = daysOfLastMonth - daysOfFirstWeek + 2 + j;
- } else if (dayNum <= daysOfMonth) {
- days[i][j] = dayNum++;
- } else {
- days[i][j] = nextDayNum++;
- }
- }
- }
- return days;
- }
- /**
- * 根据传入的年份和月份,判断上一个有多少天
- *
- * @param year
- * @param month
- * @return
- */
- public static int getLastDaysOfMonth(int year, int month) {
- int lastDaysOfMonth = 0;
- if (month == 1) {
- lastDaysOfMonth = getDaysOfMonth(year - 1, 12);
- } else {
- lastDaysOfMonth = getDaysOfMonth(year, month - 1);
- }
- return lastDaysOfMonth;
- }
- /**
- * 根据传入的年份和月份,判断当前月有多少天
- *
- * @param year
- * @param month
- * @return
- */
- public static int getDaysOfMonth(int year, int month) {
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- return 31;
- case 2:
- if (isLeap(year)) {
- return 29;
- } else {
- return 28;
- }
- case 4:
- case 6:
- case 9:
- case 11:
- return 30;
- }
- return -1;
- }
- /**
- * 判断是否为闰年
- *
- * @param year
- * @return
- */
- public static boolean isLeap(int year) {
- if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
- return true;
- }
- return false;
- }
- }
其中DateUtils类中的
public static int[][] getDayOfMonthFormat(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1);//设置时间为每月的第一天 //设置日历格式数组,6行7列 int days[][] = new int[6][7]; //设置该月的第一天是周几 int daysOfFirstWeek = calendar.get(Calendar.DAY_OF_WEEK); //设置本月有多少天 int daysOfMonth = getDaysOfMonth(year, month); //设置上个月有多少天 int daysOfLastMonth = getLastDaysOfMonth(year, month); int dayNum = 1; int nextDayNum = 1; //将日期格式填充数组 for (int i = 0; i < days.length; i++) { for (int j = 0; j < days[i].length; j++) { if (i == 0 && j < daysOfFirstWeek - 1) { days[i][j] = daysOfLastMonth - daysOfFirstWeek + 2 + j; } else if (dayNum <= daysOfMonth) { days[i][j] = dayNum++; } else { days[i][j] = nextDayNum++; } } } return days; }
是将当前月份的日期分布保存到数组中返回.
接下来,布局文件
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_weight="1"
- android:gravity="center">
- <ImageView
- android:id="@+id/record_left"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:background="@drawable/record_left_press" />
- </LinearLayout>
- <RelativeLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_weight="2"
- android:gravity="center">
- <TextView
- android:id="@+id/record_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_gravity="center"
- android:maxLines="1"
- android:text="2016年8月21日"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </RelativeLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_weight="1"
- android:gravity="center">
- <ImageView
- android:id="@+id/record_right"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:background="@drawable/record_right_press" />
- </LinearLayout>
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:layout_marginTop="10dp"
- android:orientation="horizontal">
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="日"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="一"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="二"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="三"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="四"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="五"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="六"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
- </LinearLayout>
- <GridView
- android:id="@+id/record_gridView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="20dp"
- android:numColumns="7" />
- </LinearLayout>
GridView的item文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal">
- <TextView
- android:id="@+id/date_item"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@color/colorWhite"
- android:textSize="16sp" />
- </LinearLayout>
GridView的Adapter文件
- import android.content.Context;
- import android.graphics.Color;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.TextView;
- import com.jiaoml.smallmusic.MusicApp;
- import com.jiaoml.smallmusic.R;
- import com.jiaoml.smallmusic.music.Record;
- import com.lidroid.xutils.db.sqlite.Selector;
- import com.lidroid.xutils.db.sqlite.WhereBuilder;
- import com.lidroid.xutils.exception.DbException;
- /**
- * Created by 91905 on 2016/8/24 0024.
- */
- public class DateAdapter extends BaseAdapter {
- private int[] days = new int[42];
- private Context context;
- private int year;
- private int month;
- public DateAdapter(Context context, int[][] days, int year, int month) {
- this.context = context;
- int dayNum = 0;
- //将二维数组转化为一维数组,方便使用
- for (int i = 0; i < days.length; i++) {
- for (int j = 0; j < days[i].length; j++) {
- this.days[dayNum] = days[i][j];
- dayNum++;
- }
- }
- this.year = year;
- this.month = month;
- }
- @Override
- public int getCount() {
- return days.length;
- }
- @Override
- public Object getItem(int i) {
- return days[i];
- }
- @Override
- public long getItemId(int i) {
- return i;
- }
- @Override
- public View getView(int i, View view, ViewGroup viewGroup) {
- ViewHolder viewHolder;
- if (view == null) {
- view = LayoutInflater.from(context).inflate(R.layout.date_item, null);
- viewHolder = new ViewHolder();
- viewHolder.date_item = (TextView) view.findViewById(R.id.date_item);
- view.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) view.getTag();
- }
- if (i < 7 && days[i] > 20) {
- viewHolder.date_item.setTextColor(Color.rgb(204, 204, 204));//将上个月的和下个月的设置为灰色
- } else if (i > 20 && days[i] < 15) {
- viewHolder.date_item.setTextColor(Color.rgb(204, 204, 204));
- }
- viewHolder.date_item.setText(days[i] + "");
- return view;
- }
- /**
- * 优化Adapter
- */
- class ViewHolder {
- TextView date_item;
- }
接下来是Activity文件
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.GridView;
- import android.widget.ImageView;
- import android.widget.TextView;
- import com.jiaoml.smallmusic.R;
- import com.jiaoml.smallmusic.adapter.DateAdapter;
- /**
- * Created by 91905 on 2016/8/24 0024.
- */
- public class MainActivity extends Activity implements View.OnClickListener {
- private GridView record_gridView;//定义gridView
- private DateAdapter dateAdapter;//定义adapter
- private ImageView record_left;//左箭头
- private ImageView record_right;//右箭头
- private TextView record_title;//标题
- private int year;
- private int month;
- private String title;
- private int[][] days = new int[6][7];
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- //初始化日期数据
- initData();
- //初始化组件
- initView();
- //设置标题
- setTile();
- //组件点击监听事件
- initEvent();
- }
- private void initData() {
- year = DateUtils.getYear();
- month = DateUtils.getMonth();
- }
- private void initEvent() {
- record_left.setOnClickListener(this);
- record_right.setOnClickListener(this);
- }
- private void initView() {
- /**
- * 以下是初始化GridView
- */
- record_gridView = (GridView) findViewById(R.id.record_gridView);
- days = DateUtils.getDayOfMonthFormat(2016, 8);
- dateAdapter = new DateAdapter(this, days, year, month);//传入当前月的年
- record_gridView.setAdapter(dateAdapter);
- record_gridView.setVerticalSpacing(60);
- record_gridView.setEnabled(false);
- /**
- * 以下是初始化其他组件
- */
- record_left = (ImageView) findViewById(R.id.record_left);
- record_right = (ImageView) findViewById(R.id.record_right);
- record_title = (TextView) findViewById(R.id.record_title);
- }
- /**
- * 下一个月
- *
- * @return
- */
- private int[][] nextMonth() {
- if (month == 12) {
- month = 1;
- year++;
- } else {
- month++;
- }
- days = DateUtils.getDayOfMonthFormat(year, month);
- return days;
- }
- /**
- * 上一个月
- *
- * @return
- */
- private int[][] prevMonth() {
- if (month == 1) {
- month = 12;
- year--;
- } else {
- month--;
- }
- days = DateUtils.getDayOfMonthFormat(year, month);
- return days;
- }
- /**
- * 设置标题
- */
- private void setTile() {
- title = year + "年" + month + "月";
- record_title.setText(title);
- }
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.record_left:
- days = prevMonth();
- dateAdapter = new DateAdapter(this, days, year, month);
- record_gridView.setAdapter(dateAdapter);
- dateAdapter.notifyDataSetChanged();
- setTile();
- break;
- case R.id.record_right:
- days = nextMonth();
- dateAdapter = new DateAdapter(this, days, year, month);
- record_gridView.setAdapter(dateAdapter);
- dateAdapter.notifyDataSetChanged();
- setTile();
- break;
- }
- }
- }
OK,一个简单的日历就完成了