Android使用GridView实现日历功能(详细代码)
代码有点多,发个图先:
如果懒得往下看的,可以直接下载源码吧(0分的),最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下
http://download.csdn.net/detail/onlyonecoder/6574379
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/lay_title"
- style="@style/TitleStyle"
- android:layout_width="fill_parent" >
- <TextView
- android:id="@+id/btn_back"
- style="@style/TitleLeftButtonStyle" />
- <TextView
- android:id="@+id/tv_top"
- style="@style/TitleMiddleTextStyle"
- android:text="请选择日期" />
- <TextView
- android:id="@+id/btn_goback_to_today"
- style="@style/TitleRightButtonStyle"
- android:text="今天" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="53.0dip"
- android:background="#ff394147"
- android:gravity="center_vertical" >
- <LinearLayout
- android:id="@+id/btn_prev_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/left_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle06_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.6"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tv_month"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="xxxx年14月"
- android:textColor="#ffffffff"
- android:textSize="21.0dip" />
- </LinearLayout>
- <LinearLayout
- android:id="@+id/btn_next_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/right_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle05_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="22.0dip"
- android:background="#ff8091a8" >
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周日"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周一"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周二"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周三"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周四"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周五"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周六"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- </LinearLayout>
- <GridView
- android:id="@+id/gridview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#00000000"
- android:clickable="true"
- android:clipChildren="true"
- android:columnWidth="55.0dip"
- android:horizontalSpacing="1.0dip"
- android:listSelector="@null"
- android:numColumns="7"
- android:paddingBottom="1.0dip"
- android:stretchMode="columnWidth"
- android:verticalSpacing="1.0dip" />
- </LinearLayout>
Item:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="#FFFFFF"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:gravity="center"
- android:layout_width="46dp"
- android:layout_height="55dp"
- android:id="@+id/tvtext"
- />
- </LinearLayout><strong><span style="font-size:32px;color:#ff0000;">
- </span></strong>
Adapter:
- /**
- * 日历gridview中的每一个item显示的textview
- * @author lmw
- *
- */
- public class CalendarAdapter extends BaseAdapter {
- private boolean isLeapyear = false; //是否为闰年
- private int daysOfMonth = 0; //某月的天数
- private int dayOfWeek = 0; //具体某一天是星期几
- private int lastDaysOfMonth = 0; //上一个月的总天数
- private Context context;
- private String[] dayNumber = new String[42]; //一个gridview中的日期存入此数组中
- // private static String week[] = {"周日","周一","周二","周三","周四","周五","周六"};
- private SpecialCalendar sc = null;
- private LunarCalendar lc = null;
- private Resources res = null;
- private Drawable drawable = null;
- private String currentYear = "";
- private String currentMonth = "";
- private String currentDay = "";
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- private int currentFlag = -1; //用于标记当天
- private int[] schDateTagFlag = null; //存储当月所有的日程日期
- private String showYear = ""; //用于在头部显示的年份
- private String showMonth = ""; //用于在头部显示的月份
- private String animalsYear = "";
- private String leapMonth = ""; //闰哪一个月
- private String cyclical = ""; //天干地支
- //系统当前时间
- private String sysDate = "";
- private String sys_year = "";
- private String sys_month = "";
- private String sys_day = "";
- public CalendarAdapter(){
- Date date = new Date();
- sysDate = sdf.format(date); //当期日期
- sys_year = sysDate.split("-")[0];
- sys_month = sysDate.split("-")[1];
- sys_day = sysDate.split("-")[2];
- }
- public CalendarAdapter(Context context,Resources rs,int jumpMonth,int jumpYear,int year_c,int month_c,int day_c){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- int stepYear = year_c+jumpYear;
- int stepMonth = month_c+jumpMonth ;
- if(stepMonth > 0){
- //往下一个月滑动
- if(stepMonth%12 == 0){
- stepYear = year_c + stepMonth/12 -1;
- stepMonth = 12;
- }else{
- stepYear = year_c + stepMonth/12;
- stepMonth = stepMonth%12;
- }
- }else{
- //往上一个月滑动
- stepYear = year_c - 1 + stepMonth/12;
- stepMonth = stepMonth%12 + 12;
- if(stepMonth%12 == 0){
- }
- }
- currentYear = String.valueOf(stepYear);; //得到当前的年份
- currentMonth = String.valueOf(stepMonth); //得到本月 (jumpMonth为滑动的次数,每滑动一次就增加一月或减一月)
- currentDay = String.valueOf(day_c); //得到当前日期是哪天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- public CalendarAdapter(Context context,Resources rs,int year, int month, int day){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- currentYear = String.valueOf(year);; //得到跳转到的年份
- currentMonth = String.valueOf(month); //得到跳转到的月份
- currentDay = String.valueOf(day); //得到跳转到的天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return dayNumber.length;
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if(convertView == null){
- convertView = LayoutInflater.from(context).inflate(R.layout.calendar_item, null);
- }
- TextView textView = (TextView) convertView.findViewById(R.id.tvtext);
- String d = dayNumber[position].split("\\.")[0];
- String dv = dayNumber[position].split("\\.")[1];
- SpannableString sp = new SpannableString(d+"\n"+dv);
- sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- sp.setSpan(new RelativeSizeSpan(1.2f) , 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- if(dv != null ||dv != ""){
- sp.setSpan(new RelativeSizeSpan(0.75f), d.length()+1, dayNumber[position].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- // sp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 14, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
- textView.setText(sp);
- textView.setTextColor(Color.GRAY);
- // if(position<7){
- // //设置周
- // textView.setTextColor(Color.WHITE);
- // textView.setBackgroundColor(color.search_txt_color);
- // textView.setTextSize(14);
- // }
- if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) {
- // 当前月信息显示
- textView.setTextColor(Color.BLACK);// 当月字体设黑
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- }
- if(schDateTagFlag != null && schDateTagFlag.length >0){
- for(int i = 0; i < schDateTagFlag.length; i++){
- if(schDateTagFlag[i] == position){
- //设置日程标记背景
- textView.setBackgroundResource(R.drawable.mark);
- }
- }
- }
- if(currentFlag == position){
- //设置当天的背景
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- textView.setBackgroundDrawable(drawable);
- textView.setTextColor(Color.WHITE);
- }
- return convertView;
- }
- //得到某年的某月的天数且这月的第一天是星期几
- public void getCalendar(int year, int month){
- isLeapyear = sc.isLeapYear(year); //是否为闰年
- daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的总天数
- dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天为星期几
- lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month-1); //上一个月的总天数
- Log.d("DAY", isLeapyear+" ====== "+daysOfMonth+" ============ "+dayOfWeek+" ========= "+lastDaysOfMonth);
- getweek(year,month);
- }
- //将一个月中的每一天的值添加入数组dayNuber中
- private void getweek(int year, int month) {
- int j = 1;
- int flag = 0;
- String lunarDay = "";
- //得到当前月的所有日程日期(这些日期需要标记)
- for (int i = 0; i < dayNumber.length; i++) {
- // 周一
- // if(i<7){
- // dayNumber[i]=week[i]+"."+" ";
- // }
- if(i < dayOfWeek){ //前一个月
- int temp = lastDaysOfMonth - dayOfWeek+1;
- lunarDay = lc.getLunarDate(year, month-1, temp+i,false);
- dayNumber[i] = (temp + i)+"."+lunarDay;
- }else if(i < daysOfMonth + dayOfWeek){ //本月
- String day = String.valueOf(i-dayOfWeek+1); //得到的日期
- lunarDay = lc.getLunarDate(year, month, i-dayOfWeek+1,false);
- dayNumber[i] = i-dayOfWeek+1+"."+lunarDay;
- //对于当前月才去标记当前日期
- if(sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)){
- //标记当前日期
- currentFlag = i;
- }
- setShowYear(String.valueOf(year));
- setShowMonth(String.valueOf(month));
- setAnimalsYear(lc.animalsYear(year));
- setLeapMonth(lc.leapMonth == 0?"":String.valueOf(lc.leapMonth));
- setCyclical(lc.cyclical(year));
- }else{ //下一个月
- lunarDay = lc.getLunarDate(year, month+1, j,false);
- dayNumber[i] = j+"."+lunarDay;
- j++;
- }
- }
- String abc = "";
- for(int i = 0; i < dayNumber.length; i++){
- abc = abc+dayNumber[i]+":";
- }
- Log.d("DAYNUMBER",abc);
- }
- public void matchScheduleDate(int year, int month, int day){
- }
- /**
- * 点击每一个item时返回item中的日期
- * @param position
- * @return
- */
- public String getDateByClickItem(int position){
- return dayNumber[position];
- }
- /**
- * 在点击gridView时,得到这个月中第一天的位置
- * @return
- */
- public int getStartPositon(){
- return dayOfWeek+7;
- }
- /**
- * 在点击gridView时,得到这个月中最后一天的位置
- * @return
- */
- public int getEndPosition(){
- return (dayOfWeek+daysOfMonth+7)-1;
- }
- public String getShowYear() {
- return showYear;
- }
- public void setShowYear(String showYear) {
- this.showYear = showYear;
- }
- public String getShowMonth() {
- return showMonth;
- }
- public void setShowMonth(String showMonth) {
- this.showMonth = showMonth;
- }
- public String getAnimalsYear() {
- return animalsYear;
- }
- public void setAnimalsYear(String animalsYear) {
- this.animalsYear = animalsYear;
- }
- public String getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(String leapMonth) {
- this.leapMonth = leapMonth;
- }
- public String getCyclical() {
- return cyclical;
- }
- public void setCyclical(String cyclical) {
- this.cyclical = cyclical;
- }
- }
计算类
- import java.util.Calendar;
- public class SpecialCalendar {
- private int daysOfMonth = 0; //某月的天数
- private int dayOfWeek = 0; //具体某一天是星期几
- // 判断是否为闰年
- public 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;
- }
- //得到某月有多少天数
- public 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;
- }
- //指定某年中的某月的第一天是星期几
- public 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;
- }
- }
节日和阴历计算类
关于日历实现代码里0x04bd8, 0x04ae0, 0x0a570的解释:
http://blog.csdn.net/onlyonecoder/article/details/8484118
- public class LunarCalendar {
- private int year; //农历的年份
- private int month;
- private int day;
- private String lunarMonth; //农历的月份
- private boolean leap;
- public int leapMonth = 0; //闰的是哪个月
- final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七",
- "八", "九", "十", "十一", "十二" };
- static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
- "yyyy年MM月dd日");
- final static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570,
- 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
- 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
- 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
- 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
- 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0,
- 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4,
- 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550,
- 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
- 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
- 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
- 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
- 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40,
- 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3,
- 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960,
- 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0,
- 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
- 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0,
- 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65,
- 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0,
- 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
- 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
- //农历部分假日
- final static String[] lunarHoliday = new String[]{
- "0101 春节",
- "0115 元宵",
- "0505 端午",
- "0707 七夕情人",
- "0715 中元",
- "0815 中秋",
- "0909 重阳",
- "1208 腊八",
- "1224 小年",
- "0100 除夕"
- };
- //公历部分节假日
- final static String[] solarHoliday = new String[]{
- "0101 元旦",
- "0214 情人",
- "0308 妇女",
- "0312 植树",
- "0315 消费者权益日",
- "0401 愚人",
- "0501 劳动",
- "0504 青年",
- "0512 护士",
- "0601 儿童",
- "0701 建党",
- "0801 建军",
- "0808 父亲",
- "0909 XXX逝世纪念",
- "0910 教师",
- "0928 孔子诞辰",
- "1001 国庆",
- "1006 老人",
- "1024 联合国日",
- "1112 孙中山诞辰纪念",
- "1220 澳门回归纪念",
- "1225 圣诞",
- "1226 XXX诞辰纪念"
- };
- // ====== 传回农历 y年的总天数
- final private static int yearDays(int y) {
- int i, sum = 348;
- for (i = 0x8000; i > 0x8; i >>= 1) {
- if ((lunarInfo[y - 1900] & i) != 0)
- sum += 1;
- }
- return (sum + leapDays(y));
- }
- // ====== 传回农历 y年闰月的天数
- final private static int leapDays(int y) {
- if (leapMonth(y) != 0) {
- if ((lunarInfo[y - 1900] & 0x10000) != 0)
- return 30;
- else
- return 29;
- } else
- return 0;
- }
- // ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
- final private static int leapMonth(int y) {
- return (int) (lunarInfo[y - 1900] & 0xf);
- }
- // ====== 传回农历 y年m月的总天数
- final private static int monthDays(int y, int m) {
- if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
- return 29;
- else
- return 30;
- }
- // ====== 传回农历 y年的生肖
- final public String animalsYear(int year) {
- final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇",
- "马", "羊", "猴", "鸡", "狗", "猪" };
- return Animals[(year - 4) % 12];
- }
- // ====== 传入 月日的offset 传回干支, 0=甲子
- final private static String cyclicalm(int num) {
- final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",
- "辛", "壬", "癸" };
- final String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午",
- "未", "申", "酉", "戌", "亥" };
- return (Gan[num % 10] + Zhi[num % 12]);
- }
- // ====== 传入 offset 传回干支, 0=甲子
- final public String cyclical(int year) {
- int num = year - 1900 + 36;
- return (cyclicalm(num));
- }
- public static String getChinaDayString(int day) {
- String chineseTen[] = { "初", "十", "廿", "卅" };
- int n = day % 10 == 0 ? 9 : day % 10 - 1;
- if (day > 30)
- return "";
- if (day == 10)
- return "初十";
- else
- return chineseTen[day / 10] + chineseNumber[n];
- }
- /** */
- /**
- * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数
- * dayCyl5:与1900年1月31日相差的天数,再加40 ?
- *
- * isday: 这个参数为false---日期为节假日时,阴历日期就返回节假日 ,true---不管日期是否为节假日依然返回这天对应的阴历日期
- * @param cal
- * @return
- */
- public String getLunarDate(int year_log, int month_log, int day_log, boolean isday) {
- // @SuppressWarnings("unused")
- int yearCyl, monCyl, dayCyl;
- //int leapMonth = 0;
- String nowadays;
- Date baseDate = null;
- Date nowaday = null;
- try {
- baseDate = chineseDateFormat.parse("1900年1月31日");
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- nowadays = year_log + "年" + month_log + "月" + day_log + "日";
- try {
- nowaday = chineseDateFormat.parse(nowadays);
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- // 求出和1900年1月31日相差的天数
- int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
- dayCyl = offset + 40;
- monCyl = 14;
- // 用offset减去每农历年的天数
- // 计算当天是农历第几天
- // i最终结果是农历的年份
- // offset是当年的第几天
- int iYear, daysOfYear = 0;
- for (iYear = 1900; iYear < 10000 && offset > 0; iYear++) {
- daysOfYear = yearDays(iYear);
- offset -= daysOfYear;
- monCyl += 12;
- }
- if (offset < 0) {
- offset += daysOfYear;
- iYear--;
- monCyl -= 12;
- }
- // 农历年份
- year = iYear;
- setYear(year); //设置公历对应的农历年份
- yearCyl = iYear - 1864;
- leapMonth = leapMonth(iYear); // 闰哪个月,1-12
- leap = false;
- // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
- int iMonth, daysOfMonth = 0;
- for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
- // 闰月
- if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
- --iMonth;
- leap = true;
- daysOfMonth = leapDays(year);
- } else
- daysOfMonth = monthDays(year, iMonth);
- offset -= daysOfMonth;
- // 解除闰月
- if (leap && iMonth == (leapMonth + 1))
- leap = false;
- if (!leap)
- monCyl++;
- }
- // offset为0时,并且刚才计算的月份是闰月,要校正
- if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
- if (leap) {
- leap = false;
- } else {
- leap = true;
- --iMonth;
- --monCyl;
- }
- }
- // offset小于0时,也要校正
- if (offset < 0) {
- offset += daysOfMonth;
- --iMonth;
- --monCyl;
- }
- month = iMonth;
- setLunarMonth(chineseNumber[month - 1] + "月"); //设置对应的阴历月份
- day = offset + 1;
- if(!isday){
- //如果日期为节假日则阴历日期则返回节假日
- //setLeapMonth(leapMonth);
- for(int i = 0; i < solarHoliday.length; i++){
- //返回公历节假日名称
- String sd = solarHoliday[i].split(" ")[0]; //节假日的日期
- String sdv = solarHoliday[i].split(" ")[1]; //节假日的名称
- String smonth_v = month_log+"";
- String sday_v = day_log+"";
- String smd = "";
- if(month_log < 10){
- smonth_v = "0"+month_log;
- }
- if(day_log < 10){
- sday_v = "0"+day_log;
- }
- smd = smonth_v+sday_v;
- if(sd.trim().equals(smd.trim())){
- return sdv;
- }
- }
- for(int i = 0; i < lunarHoliday.length; i++){
- //返回农历节假日名称
- String ld =lunarHoliday[i].split(" ")[0]; //节假日的日期
- String ldv = lunarHoliday[i].split(" ")[1]; //节假日的名称
- String lmonth_v = month+"";
- String lday_v = day+"";
- String lmd = "";
- if(month < 10){
- lmonth_v = "0"+month;
- }
- if(day < 10){
- lday_v = "0"+day;
- }
- lmd = lmonth_v+lday_v;
- if(ld.trim().equals(lmd.trim())){
- return ldv;
- }
- }
- }
- if (day == 1)
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- }
- public String toString() {
- if (chineseNumber[month - 1] == "一" && getChinaDayString(day) == "初一")
- return "农历" + year + "年";
- else if (getChinaDayString(day) == "初一")
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- // return year + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] +
- // "月" + getChinaDayString(day);
- }
- /*public static void main(String[] args) {
- System.out.println(new LunarCalendar().getLunarDate(2012, 1, 23));
- }*/
- public int getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(int leapMonth) {
- this.leapMonth = leapMonth;
- }
- /**
- * 得到当前日期对应的阴历月份
- * @return
- */
- public String getLunarMonth() {
- return lunarMonth;
- }
- public void setLunarMonth(String lunarMonth) {
- this.lunarMonth = lunarMonth;
- }
- /**
- * 得到当前年对应的农历年份
- * @return
- */
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- }
Activity
- /**
- * 日历显示activity
- *
- *
- */
- public class CalendarActivity extends Activity implements OnGestureListener {
- private GestureDetector gestureDetector = null;
- private CalendarAdapter calV = null;
- private GridView gridView = null;
- private TextView topText = null;
- private static int jumpMonth = 0; //每次滑动,增加或减去一个月,默认为0(即显示当前月)
- private static int jumpYear = 0; //滑动跨越一年,则增加或者减去一年,默认为0(即当前年)
- private int year_c = 0;
- private int month_c = 0;
- private int day_c = 0;
- private String currentDate = "";
- private Bundle bd=null;//发送参数
- private Bundle bun=null;//接收参数
- private String ruzhuTime;
- private String lidianTime;
- private String state="";
- public CalendarActivity() {
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- currentDate = sdf.format(date); //当期日期
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityList.activityList.add(this);
- setContentView(R.layout.calendar);
- bd=new Bundle();//out
- bun=getIntent().getExtras();//in
- if(bun!=null&&bun.getString("state").equals("ruzhu"))
- {
- state=bun.getString("state");
- System.out.println("%%%%%%"+state);
- }else if(bun!=null&&bun.getString("state").equals("lidian")){
- state=bun.getString("state");
- System.out.println("|||||||||||"+state);
- }
- gestureDetector = new GestureDetector(this);
- // bd=new Bundle();
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- addGridView();
- gridView.setAdapter(calV);
- topText = (TextView) findViewById(R.id.tv_month);
- addTextToTopTextView(topText);
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int gvFlag = 0; //每次添加gridview到viewflipper中时给的标记
- if (e1.getX() - e2.getX() > 120) {
- //像左滑动
- addGridView(); //添加一个gridView
- jumpMonth++; //下一个月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- return true;
- } else if (e1.getX() - e2.getX() < -120) {
- //向右滑动
- addGridView(); //添加一个gridView
- jumpMonth--; //上一个月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- gvFlag++;
- addTextToTopTextView(topText);
- return true;
- }
- return false;
- }
- /**
- * 创建菜单
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(0, menu.FIRST, menu.FIRST, "今天");
- return super.onCreateOptionsMenu(menu);
- }
- /**
- * 选择菜单
- */
- @Override
- public boolean onMenuItemSelected(int featureId, MenuItem item) {
- switch (item.getItemId()){
- case Menu.FIRST:
- //跳转到今天
- int xMonth = jumpMonth;
- int xYear = jumpYear;
- int gvFlag =0;
- jumpMonth = 0;
- jumpYear = 0;
- addGridView(); //添加一个gridView
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- break;
- }
- return super.onMenuItemSelected(featureId, item);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return this.gestureDetector.onTouchEvent(event);
- }
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- //添加头部的年份 闰哪月等信息
- public void addTextToTopTextView(TextView view){
- StringBuffer textDate = new StringBuffer();
- textDate.append(calV.getShowYear()).append("年").append(
- calV.getShowMonth()).append("月").append("\t");
- view.setText(textDate);
- view.setTextColor(Color.WHITE);
- view.setTypeface(Typeface.DEFAULT_BOLD);
- }
- //添加gridview
- private void addGridView() {
- gridView =(GridView)findViewById(R.id.gridview);
- gridView.setOnTouchListener(new OnTouchListener() {
- //将gridview中的触摸事件回传给gestureDetector
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- return CalendarActivity.this.gestureDetector.onTouchEvent(event);
- }
- });
- gridView.setOnItemClickListener(new OnItemClickListener() {
- //gridView中的每一个item的点击事件
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- //点击任何一个item,得到这个item的日期(排除点击的是周日到周六(点击不响应))
- int startPosition = calV.getStartPositon();
- int endPosition = calV.getEndPosition();
- if(startPosition <= position+7 && position <= endPosition-7){
- String scheduleDay = calV.getDateByClickItem(position).split("\\.")[0]; //这一天的阳历
- //String scheduleLunarDay = calV.getDateByClickItem(position).split("\\.")[1]; //这一天的阴历
- String scheduleYear = calV.getShowYear();
- String scheduleMonth = calV.getShowMonth();
- // Toast.makeText(CalendarActivity.this, scheduleYear+"-"+scheduleMonth+"-"+scheduleDay, 2000).show();
- ruzhuTime=scheduleMonth+"月"+scheduleDay+"日";
- lidianTime=scheduleMonth+"月"+scheduleDay+"日";
- Intent intent=new Intent();
- if(state.equals("ruzhu"))
- {
- bd.putString("ruzhu", ruzhuTime);
- System.out.println("ruzhuuuuuu"+bd.getString("ruzhu"));
- }else if(state.equals("lidian")){
- bd.putString("lidian", lidianTime);
- }
- intent.setClass(CalendarActivity.this, HotelActivity.class);
- intent.putExtras(bd);
- startActivity(intent);
- finish();
- }
- }
- });
- }
- }
Android使用GridView实现日历功能(详细代码)的更多相关文章
- android Json解析详解(详细代码)
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- asp.net c# repeater或gridview导出EXCEL的详细代码。
Response.Clear(); Response.Charset = "GB2312"; Response.ContentEncoding = System.Text.Enco ...
- 调用Android自带日历功能(日历列表单、添加一个日历事件)
调用Android自带日历功能 觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...
- 调用Android自带日历功能
Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android ...
- android ListView和GridView拖拽移位实现代码
关于ListView拖拽移动位置,想必大家并不陌生,比较不错的软件都用到如此功能了.如:搜狐,网易,百度等,但是相比来说还是百度的用户体验较好,不偏心了,下面看几个示例: 首先 ...
- Android开发之将Edittext输入弹出的软键盘设置搜索确定键。详细代码,已验证可用。
1,首先在布局中添加 android:imeOptions="actionSearch 2,然后java代码中设置代码: et_input_password.setOnEditorActio ...
- Android中GridView通过自定义适配器(未优化)实现图文视图排列
Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- Android中GridView的使用——使用自带的SimpleAdapter(简单适配器)
GridView一直是一个系统登录后以九宫格方式展现功能子模块的最佳选择,经过试验和网上资料的查阅,现把实现方式总结一下: 一直是通过自定义Adapter方式,在getView()方法中设置图片的显示 ...
随机推荐
- mssql sql高效关联子查询的update 批量更新
/* 使用带关联子查询的Update更新 --1.创建测试表 create TABLE Table1 ( a varchar(10), b varchar(10), ...
- 报错:ORA-02287: 此处不允许序号
CREATE TABLE MY_TAB (N1 NUMBER(5),N2 DATE); SELECT * FROM MY_TAB; CREATE SEQUENCE ...
- 【原】AVAudio录制,播放 (解决真机播放音量太小)
原文链接:http://www.cnblogs.com/A--G/p/4624526.html 最近学习AVFoundation里的audio操作,最基本的录制和播放,参考了一个Code4pp的 一个 ...
- linux术语解析(持续更新)
1.linux内核有个版本,分别是 longterm: 提供长期支持的内核版本 stable: 稳定版本 Beta 测试版
- .net中XML的创建02(linqToXml)
linqToXml比较的灵活和方便,它是基于函数式编程具体的使用如下:引用程序集using System.Xml.Linq; 1.创建XDocument并设置文档头 XDocument XDoc = ...
- cxf客户端代码wsdlLocation设置相对路径
利用工生成的cxf客户端代码,wsdlLocation都是绝对路径,为了便于项目更加灵活管理,我们可以将该路径设置为相对路径: 1.下面图片是我的项目路径图片及wsdl地址存放路径: 2.下面图片是我 ...
- 重新开始学习javase_隐藏实施过程
一.隐藏实施过程 对于隐藏实施过程,thinking in java中讲了很好,无非就是一个好的程序尽量做到,对外公开的程序,即使内部程序发生变动,也不会影响这些公开的服务的使用 类的导入java中的 ...
- birt 运行环境搭建(部署到tomcat)
最近一直在研究eclipse的birt,各种坑~~~~(>_<)~~~~. Requirements:tomcat version:7.0,birt-runtime-4.6.0-20160 ...
- IDEA中Maven管理下添加mysql依赖
在做Java Web项目的时候,不可避免的就要使用到数据库,下面就是在IDEA中添加mysql依赖的方法. 如果你看到这里,就表示你弄懂了IDEA,maven和Tomcat等,所以... 只需要在po ...
- jdk-动态代理
1.HelloWorld package reflect.proxy; public interface HelloWorld { void print(); } 2.HelloWorldImpl p ...