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

作者:limengwe 时间:2022-01-24 15:39:00 

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 父亲",
         "0909 * 逝世纪念",
         "0910 教师",
         "0928 孔子诞辰",
         "1001 国庆",
         "1006 老人",
         "1024 联合国日",
         "1112 孙中山诞辰纪念",
         "1220 澳门回归纪念",
         "1225 圣诞",
         "1226 * 诞辰纪念"
};

// ====== 传回农历 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();
    }
    }

});
}

}

源码下载。。。。

来源:http://blog.csdn.net/onlyonecoder/article/details/8481799

标签:android,gridview,日历
0
投稿

猜你喜欢

  • 深入了解Spring中的@Autowired和@Resource注解

    2021-09-19 06:57:20
  • 详解android系统的定制

    2022-03-14 11:20:19
  • Java 数据库连接池详解及简单实例

    2023-08-10 15:54:07
  • Java如何实现压缩文件与解压缩zip文件

    2022-01-28 09:14:00
  • Android本地验证码的生成代码

    2023-05-03 18:44:02
  • spring cloud 配置中心native配置方式

    2022-06-13 00:36:32
  • 不安装excel使用c#创建excel文件

    2023-02-20 07:03:25
  • Eclipse查看开发包jar里源代码的方法

    2023-08-01 14:47:57
  • c#实现ini文件读写类分享

    2022-08-31 09:47:48
  • Android编程判断当前应用是否在后台运行的方法示例

    2021-10-29 12:09:36
  • Java实例讲解Comparator的使用

    2021-07-15 09:16:58
  • Android handle-message的发送与处理案例详解

    2023-07-21 09:28:13
  • 使用java反射将结果集封装成为对象和对象集合操作

    2022-03-11 18:30:26
  • Springboot整合Dozer实现深度复制的方法

    2023-11-12 17:18:11
  • 简单捋捋@RequestParam 和 @RequestBody的使用

    2022-11-02 16:19:20
  • java客户端登陆服务器用户名验证

    2023-11-09 07:03:09
  • 基于request获取访问者真实IP代码示例

    2023-02-15 02:45:13
  • idea设置JVM运行参数的几种方式

    2023-05-26 14:57:33
  • Java利用自定义注解、反射实现简单BaseDao实例

    2022-09-06 05:29:30
  • Android服务Service教程

    2022-02-19 13:05:40
  • asp之家 软件编程 m.aspxhome.com