全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android使用GridView实现日历功能示例(详细代码)

Android使用GridView实现日历功能示例,代码有点多,发个图先:

如果懒得往下看的,可以直接下载源码吧,最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下

源码下载。。。。

布局文件:

<?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>

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的解释:

new Array(
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,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,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,
0x14b63);

正确的解释是:

 二进制形式

xxxx xxxx xxxx xxxx xxxx
20-17 16-12 12-9 8-5 4-1 

1-4: 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。

5-16:为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。

            注意:从1月到12月对应的是第16位到第5位。

17-20: 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。

举个例子:

1980年的数据是: 0x095b0

二进制:0000    1001 0101 1011 0000

 表示1980年没有闰月,从1月到12月的天数依次为:30、29、29、30 、29、30、29、30、 30、29、30、30。

1982年的数据是:0x0a974

0000 1010 0 1001 0111 0100

表示1982年的4月为闰月,即有第二个4月,且是闰小月。

从1月到13月的天数依次为:30、29、30、29、 29(闰月)、 30、29、29、30、 29、30、30、30。

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 父亲", 
          "0910 教师", 
          "1001 国庆", 
          "1024 联合国日", 
          "1225 圣诞"
 }; 
  
 // ====== 传回农历 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 日历实现  # gridview实现日历  # Android使用GridView实现日历的简单功能  # Android使用GridView实现日历的方法  # 个月  # 一个月  # 的是  # 求出  # 几天  # 上一  # 跳转到  # 月中  # 大月  # 当天  # 这一  # 周日  # 下一  # 当月  # 当年  # 中元  # 人要  # 前年  # 依次为  # 源码下载 


相关文章: 如何用IIS7快速搭建并优化网站站点?  如何通过网站建站时间优化SEO与用户体验?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何高效配置IIS服务器搭建网站?  如何在万网ECS上快速搭建专属网站?  如何自定义建站之星模板颜色并下载新样式?  建站上市公司网站建设方案与SEO优化服务定制指南  孙琪峥织梦建站教程如何优化数据库安全?  广州建站公司哪家好?十大优质服务商推荐  ,如何利用word制作宣传手册?  如何实现建站之星域名转发设置?  制作公司内部网站有哪些,内网如何建网站?  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何通过可视化优化提升建站效果?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站与域名管理如何高效结合?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何使用Golang安装API文档生成工具_快速生成接口文档  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  外贸公司网站制作哪家好,maersk船公司官网?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  seo网站制作优化,网站SEO优化步骤有哪些?  如何快速上传自定义模板至建站之星?  内网网站制作软件,内网的网站如何发布到外网?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何快速查询网站的真实建站时间?  北京专业网站制作设计师招聘,北京白云观官方网站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  网站代码制作软件有哪些,如何生成自己网站的代码?  建站之星如何快速生成多端适配网站?  公司网站设计制作厂家,怎么创建自己的一个网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站之星在线客服如何快速接入解答?  ,南京靠谱的征婚网站?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  攀枝花网站建设,攀枝花营业执照网上怎么年审?  济南网站制作的价格,历城一职专官方网站?  宝塔新建站点报错如何解决?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机数据库如何配置才能提升网站性能?  建站之星安装后如何配置SEO及设计样式?  制作网站的基本流程,设计网站的软件是什么?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  ,制作一个手机app网站要多少钱?  建站之星安装路径如何正确选择及配置?  建站之星如何快速解决建站难题?  个人网站制作流程图片大全,个人网站如何注销?  青岛网站建设如何选择本地服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。