安卓简单日历的实现

 

安卓简单日历的实现

标签: javaandroid日历gridviewclass
  721人阅读  评论(0)  收藏  举报
  分类:
最近无聊在做一个项目,需要用到日历。日历并不需要太复杂,只需要能够简单的查看就行,所以我选用了java提供的Calendar类,和安卓的gridView组合的形式.
先看效果图:
背景什么的先不要管他。只看主体部分,左箭头查看上个月的,右箭头查看下个月的.
接下来开始我们的日历。
首先,需要使用Calendar自己构造一个DateUtils类,这个相当简单。
[java]  view plain  copy
  1. import java.util.Calendar;  
  2.   
  3. /** 
  4.  * Created by 91905 on 2016/8/22 0022. 
  5.  */  
  6.   
  7. public class DateUtils {  
  8.     /** 
  9.      * 获取当前年份 
  10.      * 
  11.      * @return 
  12.      */  
  13.     public static int getYear() {  
  14.         return Calendar.getInstance().get(Calendar.YEAR);  
  15.     }  
  16.   
  17.     /** 
  18.      * 获取当前月份 
  19.      * 
  20.      * @return 
  21.      */  
  22.     public static int getMonth() {  
  23.         return Calendar.getInstance().get(Calendar.MONTH) + 1;  
  24.     }  
  25.   
  26.     /** 
  27.      * 获取当前日期是该月的第几天 
  28.      * 
  29.      * @return 
  30.      */  
  31.     public static int getCurrentDayOfMonth() {  
  32.         return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);  
  33.     }  
  34.   
  35.     /** 
  36.      * 获取当前日期是该周的第几天 
  37.      * 
  38.      * @return 
  39.      */  
  40.     public static int getCurrentDayOfWeek() {  
  41.         return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);  
  42.     }  
  43.   
  44.     /** 
  45.      * 获取当前是几点 
  46.      */  
  47.     public static int getHour() {  
  48.         return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);//二十四小时制  
  49.     }  
  50.   
  51.     /** 
  52.      * 获取当前是几分 
  53.      * 
  54.      * @return 
  55.      */  
  56.     public static int getMinute() {  
  57.         return Calendar.getInstance().get(Calendar.MINUTE);  
  58.     }  
  59.   
  60.     /** 
  61.      * 获取当前秒 
  62.      * 
  63.      * @return 
  64.      */  
  65.     public static int getSecond() {  
  66.         return Calendar.getInstance().get(Calendar.SECOND);  
  67.     }  
  68.   
  69.     /** 
  70.      * 根据传入的年份和月份,获取当前月份的日历分布 
  71.      * 
  72.      * @param year 
  73.      * @param month 
  74.      * @return 
  75.      */  
  76.     public static int[][] getDayOfMonthFormat(int year, int month) {  
  77.         Calendar calendar = Calendar.getInstance();  
  78.         calendar.set(year, month - 11);//设置时间为每月的第一天  
  79.         //设置日历格式数组,6行7列  
  80.         int days[][] = new int[6][7];  
  81.         //设置该月的第一天是周几  
  82.         int daysOfFirstWeek = calendar.get(Calendar.DAY_OF_WEEK);  
  83.         //设置本月有多少天  
  84.         int daysOfMonth = getDaysOfMonth(year, month);  
  85.         //设置上个月有多少天  
  86.         int daysOfLastMonth = getLastDaysOfMonth(year, month);  
  87.         int dayNum = 1;  
  88.         int nextDayNum = 1;  
  89.         //将日期格式填充数组  
  90.         for (int i = 0; i < days.length; i++) {  
  91.             for (int j = 0; j < days[i].length; j++) {  
  92.                 if (i == 0 && j < daysOfFirstWeek - 1) {  
  93.                     days[i][j] = daysOfLastMonth - daysOfFirstWeek + 2 + j;  
  94.                 } else if (dayNum <= daysOfMonth) {  
  95.                     days[i][j] = dayNum++;  
  96.                 } else {  
  97.                     days[i][j] = nextDayNum++;  
  98.                 }  
  99.             }  
  100.         }  
  101.         return days;  
  102.     }  
  103.   
  104.     /** 
  105.      * 根据传入的年份和月份,判断上一个有多少天 
  106.      * 
  107.      * @param year 
  108.      * @param month 
  109.      * @return 
  110.      */  
  111.     public static int getLastDaysOfMonth(int year, int month) {  
  112.         int lastDaysOfMonth = 0;  
  113.         if (month == 1) {  
  114.             lastDaysOfMonth = getDaysOfMonth(year - 112);  
  115.         } else {  
  116.             lastDaysOfMonth = getDaysOfMonth(year, month - 1);  
  117.         }  
  118.         return lastDaysOfMonth;  
  119.     }  
  120.   
  121.     /** 
  122.      * 根据传入的年份和月份,判断当前月有多少天 
  123.      * 
  124.      * @param year 
  125.      * @param month 
  126.      * @return 
  127.      */  
  128.     public static int getDaysOfMonth(int year, int month) {  
  129.         switch (month) {  
  130.             case 1:  
  131.             case 3:  
  132.             case 5:  
  133.             case 7:  
  134.             case 8:  
  135.             case 10:  
  136.             case 12:  
  137.                 return 31;  
  138.             case 2:  
  139.                 if (isLeap(year)) {  
  140.                     return 29;  
  141.                 } else {  
  142.                     return 28;  
  143.                 }  
  144.             case 4:  
  145.             case 6:  
  146.             case 9:  
  147.             case 11:  
  148.                 return 30;  
  149.         }  
  150.         return -1;  
  151.     }  
  152.   
  153.     /** 
  154.      * 判断是否为闰年 
  155.      * 
  156.      * @param year 
  157.      * @return 
  158.      */  
  159.     public static boolean isLeap(int year) {  
  160.         if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {  
  161.             return true;  
  162.         }  
  163.         return false;  
  164.     }  
  165. }  
其中DateUtils类中的
public static int[][] getDayOfMonthFormat(int year, int month) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month - 1, 1);//设置时间为每月的第一天
    //设置日历格式数组,67    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;
}
是将当前月份的日期分布保存到数组中返回.
接下来,布局文件
[html]  view plain  copy
  1. <LinearLayout  
  2.         android:layout_width="match_parent"  
  3.         android:layout_height="wrap_content">  
  4.   
  5.         <LinearLayout  
  6.             android:layout_width="0dp"  
  7.             android:layout_height="wrap_content"  
  8.             android:layout_gravity="center_vertical"  
  9.             android:layout_weight="1"  
  10.             android:gravity="center">  
  11.   
  12.             <ImageView  
  13.                 android:id="@+id/record_left"  
  14.                 android:layout_width="40dp"  
  15.                 android:layout_height="40dp"  
  16.                 android:background="@drawable/record_left_press" />  
  17.   
  18.         </LinearLayout>  
  19.   
  20.         <RelativeLayout  
  21.             android:layout_width="0dp"  
  22.             android:layout_height="wrap_content"  
  23.             android:layout_gravity="center_vertical"  
  24.             android:layout_weight="2"  
  25.             android:gravity="center">  
  26.   
  27.             <TextView  
  28.                 android:id="@+id/record_title"  
  29.                 android:layout_width="wrap_content"  
  30.                 android:layout_height="wrap_content"  
  31.                 android:layout_centerHorizontal="true"  
  32.                 android:layout_gravity="center"  
  33.                 android:maxLines="1"  
  34.                 android:text="2016年8月21日"  
  35.                 android:textColor="@color/colorWhite"  
  36.                 android:textSize="16sp" />  
  37.         </RelativeLayout>  
  38.   
  39.         <LinearLayout  
  40.             android:layout_width="0dp"  
  41.             android:layout_height="wrap_content"  
  42.             android:layout_gravity="center_vertical"  
  43.             android:layout_weight="1"  
  44.             android:gravity="center">  
  45.   
  46.             <ImageView  
  47.                 android:id="@+id/record_right"  
  48.                 android:layout_width="40dp"  
  49.                 android:layout_height="40dp"  
  50.                 android:background="@drawable/record_right_press" />  
  51.         </LinearLayout>  
  52.     </LinearLayout>  
  53.   
  54.     <LinearLayout  
  55.         android:layout_width="match_parent"  
  56.         android:layout_height="0dp"  
  57.         android:layout_weight="1"  
  58.         android:orientation="vertical">  
  59.   
  60.         <LinearLayout  
  61.             android:layout_width="match_parent"  
  62.             android:layout_height="wrap_content"  
  63.             android:layout_marginLeft="20dp"  
  64.             android:layout_marginRight="20dp"  
  65.             android:layout_marginTop="10dp"  
  66.             android:orientation="horizontal">  
  67.   
  68.             <LinearLayout  
  69.                 android:layout_width="0dp"  
  70.                 android:layout_height="wrap_content"  
  71.                 android:layout_weight="1"  
  72.                 android:gravity="center">  
  73.   
  74.                 <TextView  
  75.                     android:layout_width="wrap_content"  
  76.                     android:layout_height="wrap_content"  
  77.                     android:text="日"  
  78.                     android:textColor="@color/colorWhite"  
  79.                     android:textSize="16sp" />  
  80.             </LinearLayout>  
  81.   
  82.             <LinearLayout  
  83.                 android:layout_width="0dp"  
  84.                 android:layout_height="wrap_content"  
  85.                 android:layout_weight="1"  
  86.                 android:gravity="center">  
  87.   
  88.                 <TextView  
  89.                     android:layout_width="wrap_content"  
  90.                     android:layout_height="wrap_content"  
  91.                     android:text="一"  
  92.                     android:textColor="@color/colorWhite"  
  93.                     android:textSize="16sp" />  
  94.             </LinearLayout>  
  95.   
  96.             <LinearLayout  
  97.                 android:layout_width="0dp"  
  98.                 android:layout_height="wrap_content"  
  99.                 android:layout_weight="1"  
  100.                 android:gravity="center">  
  101.   
  102.                 <TextView  
  103.                     android:layout_width="wrap_content"  
  104.                     android:layout_height="wrap_content"  
  105.                     android:text="二"  
  106.                     android:textColor="@color/colorWhite"  
  107.                     android:textSize="16sp" />  
  108.             </LinearLayout>  
  109.   
  110.             <LinearLayout  
  111.                 android:layout_width="0dp"  
  112.                 android:layout_height="wrap_content"  
  113.                 android:layout_weight="1"  
  114.                 android:gravity="center">  
  115.   
  116.                 <TextView  
  117.                     android:layout_width="wrap_content"  
  118.                     android:layout_height="wrap_content"  
  119.                     android:text="三"  
  120.                     android:textColor="@color/colorWhite"  
  121.                     android:textSize="16sp" />  
  122.             </LinearLayout>  
  123.   
  124.             <LinearLayout  
  125.                 android:layout_width="0dp"  
  126.                 android:layout_height="wrap_content"  
  127.                 android:layout_weight="1"  
  128.                 android:gravity="center">  
  129.   
  130.                 <TextView  
  131.                     android:layout_width="wrap_content"  
  132.                     android:layout_height="wrap_content"  
  133.                     android:text="四"  
  134.                     android:textColor="@color/colorWhite"  
  135.                     android:textSize="16sp" />  
  136.             </LinearLayout>  
  137.   
  138.             <LinearLayout  
  139.                 android:layout_width="0dp"  
  140.                 android:layout_height="wrap_content"  
  141.                 android:layout_weight="1"  
  142.                 android:gravity="center">  
  143.   
  144.                 <TextView  
  145.                     android:layout_width="wrap_content"  
  146.                     android:layout_height="wrap_content"  
  147.                     android:text="五"  
  148.                     android:textColor="@color/colorWhite"  
  149.                     android:textSize="16sp" />  
  150.             </LinearLayout>  
  151.   
  152.             <LinearLayout  
  153.                 android:layout_width="0dp"  
  154.                 android:layout_height="wrap_content"  
  155.                 android:layout_weight="1"  
  156.                 android:gravity="center">  
  157.   
  158.                 <TextView  
  159.                     android:layout_width="wrap_content"  
  160.                     android:layout_height="wrap_content"  
  161.                     android:text="六"  
  162.                     android:textColor="@color/colorWhite"  
  163.                     android:textSize="16sp" />  
  164.             </LinearLayout>  
  165.         </LinearLayout>  
  166.   
  167.         <GridView  
  168.             android:id="@+id/record_gridView"  
  169.             android:layout_width="match_parent"  
  170.             android:layout_height="match_parent"  
  171.             android:layout_margin="20dp"  
  172.             android:numColumns="7" />  
  173.     </LinearLayout>  

GridView的item文件
[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center"  
  6.     android:orientation="horizontal">  
  7.   
  8.     <TextView  
  9.         android:id="@+id/date_item"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:textColor="@color/colorWhite"  
  13.         android:textSize="16sp" />  
  14. </LinearLayout>  

GridView的Adapter文件
[java]  view plain  copy
  1. import android.content.Context;  
  2. import android.graphics.Color;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7. import android.widget.TextView;  
  8.   
  9. import com.jiaoml.smallmusic.MusicApp;  
  10. import com.jiaoml.smallmusic.R;  
  11. import com.jiaoml.smallmusic.music.Record;  
  12. import com.lidroid.xutils.db.sqlite.Selector;  
  13. import com.lidroid.xutils.db.sqlite.WhereBuilder;  
  14. import com.lidroid.xutils.exception.DbException;  
  15.   
  16. /** 
  17.  * Created by 91905 on 2016/8/24 0024. 
  18.  */  
  19.   
  20. public class DateAdapter extends BaseAdapter {  
  21.     private int[] days = new int[42];  
  22.     private Context context;  
  23.     private int year;  
  24.     private int month;  
  25.   
  26.     public DateAdapter(Context context, int[][] days, int year, int month) {  
  27.         this.context = context;  
  28.         int dayNum = 0;  
[java]  view plain  copy
  1. //将二维数组转化为一维数组,方便使用  
  2.        for (int i = 0; i < days.length; i++) {  
  3.            for (int j = 0; j < days[i].length; j++) {  
  4.                this.days[dayNum] = days[i][j];  
  5.                dayNum++;  
  6.            }  
  7.        }  
  8.        this.year = year;  
  9.        this.month = month;  
  10.    }  
  11.   
  12.    @Override  
  13.    public int getCount() {  
  14.        return days.length;  
  15.    }  
  16.   
  17.    @Override  
  18.    public Object getItem(int i) {  
  19.        return days[i];  
  20.    }  
  21.   
  22.    @Override  
  23.    public long getItemId(int i) {  
  24.        return i;  
  25.    }  
  26.   
  27.    @Override  
  28.    public View getView(int i, View view, ViewGroup viewGroup) {  
  29.        ViewHolder viewHolder;  
  30.        if (view == null) {  
  31.            view = LayoutInflater.from(context).inflate(R.layout.date_item, null);  
  32.            viewHolder = new ViewHolder();  
  33.            viewHolder.date_item = (TextView) view.findViewById(R.id.date_item);  
  34.            view.setTag(viewHolder);  
  35.        } else {  
  36.            viewHolder = (ViewHolder) view.getTag();  
  37.        }  
  38.        if (i < 7 && days[i] > 20) {  
  39.            viewHolder.date_item.setTextColor(Color.rgb(204204204));//将上个月的和下个月的设置为灰色  
  40.        } else if (i > 20 && days[i] < 15) {  
  41.            viewHolder.date_item.setTextColor(Color.rgb(204204204));  
  42.        }  
[java]  view plain  copy
  1. viewHolder.date_item.setText(days[i] + "");  
  2.   
  3.        return view;  
  4.    }  
  5.   
  6.    /** 
  7.     * 优化Adapter 
  8.     */  
  9.    class ViewHolder {  
  10.        TextView date_item;  
  11.    }  

接下来是Activity文件
[java]  view plain  copy
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.widget.GridView;  
  5. import android.widget.ImageView;  
  6. import android.widget.TextView;  
  7.   
  8.   
  9. import com.jiaoml.smallmusic.R;  
  10. import com.jiaoml.smallmusic.adapter.DateAdapter;  
  11.   
  12. /** 
  13.  * Created by 91905 on 2016/8/24 0024. 
  14.  */  
  15.   
  16. public class MainActivity extends Activity implements View.OnClickListener {  
  17.     private GridView record_gridView;//定义gridView  
  18.     private DateAdapter dateAdapter;//定义adapter  
  19.     private ImageView record_left;//左箭头  
  20.     private ImageView record_right;//右箭头  
  21.     private TextView record_title;//标题  
  22.     private int year;  
  23.     private int month;  
  24.     private String title;  
  25.     private int[][] days = new int[6][7];  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState); 
  30. setContentView(R.layout.activity_main); 

  31.         //初始化日期数据  
  32.         initData();  
  33.         //初始化组件  
  34.         initView(); 
  35. //设置标题
  36. setTile(); 
  37.         //组件点击监听事件  
  38.         initEvent();  
  39.     }  
  40.   
  41.     private void initData() {  
  42.         year = DateUtils.getYear();  
  43.         month = DateUtils.getMonth();  
  44.     }  
  45.   
  46.     private void initEvent() {  
  47.         record_left.setOnClickListener(this);  
  48.         record_right.setOnClickListener(this);  
  49.     }  
  50.   
  51.     private void initView() {  
  52.         /** 
  53.          * 以下是初始化GridView 
  54.          */  
  55.         record_gridView = (GridView) findViewById(R.id.record_gridView);  
  56.         days = DateUtils.getDayOfMonthFormat(20168);  
  57.         dateAdapter = new DateAdapter(this, days, year, month);//传入当前月的年  
  58.         record_gridView.setAdapter(dateAdapter);  
  59.         record_gridView.setVerticalSpacing(60);  
  60.         record_gridView.setEnabled(false);  
  61.         /** 
  62.          * 以下是初始化其他组件 
  63.          */  
  64.         record_left = (ImageView) findViewById(R.id.record_left);  
  65.         record_right = (ImageView) findViewById(R.id.record_right);  
  66.         record_title = (TextView) findViewById(R.id.record_title);  
  67.     }  
  68.   
  69.   
  70.     /** 
  71.      * 下一个月 
  72.      * 
  73.      * @return 
  74.      */  
  75.     private int[][] nextMonth() {  
  76.         if (month == 12) {  
  77.             month = 1;  
  78.             year++;  
  79.         } else {  
  80.             month++;  
  81.         }  
  82.         days = DateUtils.getDayOfMonthFormat(year, month);  
  83.         return days;  
  84.     }  
  85.   
  86.     /** 
  87.      * 上一个月 
  88.      * 
  89.      * @return 
  90.      */  
  91.     private int[][] prevMonth() {  
  92.         if (month == 1) {  
  93.             month = 12;  
  94.             year--;  
  95.         } else {  
  96.             month--;  
  97.         }  
  98.         days = DateUtils.getDayOfMonthFormat(year, month);  
  99.         return days;  
  100.     }  
  101.   
  102.     /** 
  103.      * 设置标题 
  104.      */  
  105.     private void setTile() {  
  106.         title = year + "年" + month + "月";  
  107.         record_title.setText(title);  
  108.     }  
  109.   
  110.     @Override  
  111.     public void onClick(View view) {  
  112.         switch (view.getId()) {  
  113.             case R.id.record_left:  
  114.                 days = prevMonth();  
  115.                 dateAdapter = new DateAdapter(this, days, year, month);  
  116.                 record_gridView.setAdapter(dateAdapter);  
  117.                 dateAdapter.notifyDataSetChanged();  
  118.                 setTile();  
  119.                 break;  
  120.             case R.id.record_right:  
  121.                 days = nextMonth();  
  122.                 dateAdapter = new DateAdapter(this, days, year, month);  
  123.                 record_gridView.setAdapter(dateAdapter);  
  124.                 dateAdapter.notifyDataSetChanged();  
  125.                 setTile();  
  126.                 break;  
  127.         }  
  128.     }  
  129. }  

OK,一个简单的日历就完成了
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值