Android万年历实现源代码
jopen
10年前
/** * 日期工具类 * */ public class DateUtils { /** * 某月的天数 */ private static int daysOfMonth = 0; /** * 具体某一天是星期几 */ private static int dayOfWeek = 0; /** * 判断是否为闰年 * * @param year * 指定的年份 * @return */ public static boolean isLeapYear(int year) { if (year % 100 == 0 && year % 400 == 0) { return true; } else if (year % 100 != 0 && year % 4 == 0) { return true; } return false; } /** * 得到某月有多少天数 * * @param isLeapyear * 目标年份 * @param month * 目标月份 * @return */ public static int getDaysOfMonth(boolean isLeapyear, int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: daysOfMonth = 31; break; case 4: case 6: case 9: case 11: daysOfMonth = 30; break; case 2: if (isLeapyear) { daysOfMonth = 29; } else { daysOfMonth = 28; } } return daysOfMonth; } /** * 指定某年中的某月的第一天是星期几 * * @param isLeapyear * 目标年份 * @param month * 目标月份 * @return */ public static int getWeekdayOfMonth(int year, int month) { Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, 1); dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1; return dayOfWeek; } /** * 获取当前年份与月份 * * @return 返回日期数组,整形array[0],为年份,array[1]为月份, array[2]为日期 */ public static int[] getCurrentYearAndMonth() { int[] result = new int[3]; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); String str = ""; Date date = new Date(); str = sdf.format(date); // 当期日期 result[0] = Integer.parseInt(str.split("-")[0]); result[1] = Integer.parseInt(str.split("-")[1]); result[2] = Integer.parseInt(str.split("-")[2]); return result; } } //日历适配器: /** * 日历适配器 */ public class CalendarAdapter extends BaseAdapter{ private Context context; private TextView dateText; /** * 时间 */ private String[] dateTime; /** * 判断是不是当月的日期 */ private int[] dayFlag; /** *判断是否是已签到日 */ private int[] signedFlag; public CalendarAdapter(Context context, String[] dateTime, int[] dayFlag, int[] signedFlag){ this.context = context; this.dateTime = dateTime; this.dayFlag = dayFlag; this.signedFlag = signedFlag; } @Override public int getCount() { // TODO Auto-generated method stub return dateTime.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { dateText = new TextView(context); dateText.setGravity(Gravity.CENTER); dateText.setTextSize(18); dateText.setWidth(46); dateText.setHeight(56); dateText.setPadding(5, 5, 5, 5); dateText.setText(dateTime[position]); //如果不是当月的日期 if(position > 6 && dayFlag[position] == 0){ dateText.setTextColor(Color.parseColor("#303030")); }else if(position > 6 && dayFlag[position] == 1){ dateText.setTextColor(Color.parseColor("#7F7F7F")); }else if(position < 7){ dateText.setTextColor(Color.parseColor("#7F7F7F")); } //判断是否为周末,改变字体颜色 if(position > 6 && position % 7 == 0){ dateText.setTextColor(Color.parseColor("#FF5F20")); }else if(position > 6 && (position+1) % 7 ==0){ dateText.setTextColor(Color.parseColor("#FF5F20")); } //判断是否为历史签到日,是则改变背景 if(dayFlag[position] == 1){ for(int index=0; index<signedFlag.length; index++){ if(dateTime[position].equals("" + signedFlag[index])){ dateText.setBackgroundColor(Color.parseColor("#FEDED2")); //如果是最新签到的日期,改变字体,背景 if(index == 0){ dateText.setBackgroundColor(Color.parseColor("#FF5F20")); dateText.setTextColor(Color.parseColor("#FFFFFE")); } } } } return dateText; } } //最后是使用时的方法 /** * 当月的天数 */ private String[] monthData; /** * 历史签到数 */ private String[] historySignRecord; /** * 判断是否为当月的 */ private int[] dayFlag; /** * 是否为已签到日 */ private int[] daySignedFlag; /** * 当前年月日日期 */ private int[] currentDate; /** * 一个月中的第一天是星期几 */ private int firstDayOfMonth; /** * 一个月的总天数 */ private int daysOFMonth; /** * 上个月的总天数 */ private int lastDaysOFMonth; private int tempYear; private int tempMonth; private int index; /** * 初始化日历相关数据 * * @param year * 指定年份 * @param month * 指定月份 */ private void initCalData(int year, int month) { // 当月日历显示在49格中 int num; monthData = new String[49]; dayFlag = new int[49]; firstDayOfMonth = DateUtils.getWeekdayOfMonth(year, month); currentDateText.setText(year + "年" + month + "月"); // 判断是否为闰年 if (DateUtils.isLeapYear(year)) { daysOFMonth = DateUtils.getDaysOfMonth(true, month); lastDaysOFMonth = DateUtils.getDaysOfMonth(true, month - 1); } else { daysOFMonth = DateUtils.getDaysOfMonth(false, month); lastDaysOFMonth = DateUtils.getDaysOfMonth(false, month - 1); } // 前7个格子为周一到周日文字说明 for (index = 0; index < 7; index++) { monthData[index] = ShopBaseMessage.WEEK_DATA[index]; dayFlag[index] = 0; } // 显示上个月的日期 if (firstDayOfMonth == 0) { firstDayOfMonth = 7; } // 如果是周日为第一天,则留一行上月的天数 for (index = 7 + firstDayOfMonth - 1; index >= 7; index--, lastDaysOFMonth--) { monthData[index] = lastDaysOFMonth + ""; dayFlag[index] = 0; } // 当月的天数 for (num = 1, index = 7 + firstDayOfMonth; index < 7 + firstDayOfMonth + daysOFMonth; index++, num++) { monthData[index] = num + ""; dayFlag[index] = 1; } // 显示下个月的日期 for (num = 1, index = 7 + firstDayOfMonth + daysOFMonth; index < 49; index++, num++) { monthData[index] = num + ""; dayFlag[index] = 0; } initSignedFlag(year, month); calAdapter = new CalendarAdapter(this, monthData, dayFlag, daySignedFlag); calGridView.setAdapter(calAdapter); calGridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); // 去除gridView边框 }