Android使用GridView实现日历功能示例(详细代码)
作者:limengwe 时间:2022-01-24 15:39:00
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,日历
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
深入了解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
![](https://img.aspxhome.com/file/2023/6/67496_0s.png)
Android本地验证码的生成代码
2023-05-03 18:44:02
![](https://img.aspxhome.com/file/2023/4/120114_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/7/105977_0s.jpg)
使用java反射将结果集封装成为对象和对象集合操作
2022-03-11 18:30:26
Springboot整合Dozer实现深度复制的方法
2023-11-12 17:18:11
简单捋捋@RequestParam 和 @RequestBody的使用
2022-11-02 16:19:20
![](https://img.aspxhome.com/file/2023/4/67694_0s.png)
java客户端登陆服务器用户名验证
2023-11-09 07:03:09
![](https://img.aspxhome.com/file/2023/3/63283_0s.png)
基于request获取访问者真实IP代码示例
2023-02-15 02:45:13
idea设置JVM运行参数的几种方式
2023-05-26 14:57:33
![](https://img.aspxhome.com/file/2023/3/63803_0s.png)
Java利用自定义注解、反射实现简单BaseDao实例
2022-09-06 05:29:30
![](https://img.aspxhome.com/file/2023/5/125255_0s.png)
Android服务Service教程
2022-02-19 13:05:40
![](https://img.aspxhome.com/file/2023/5/96025_0s.png)