最近无聊在做一个项目,需要用到日历。日历并不需要太复杂,只需要能够简单的查看就行,所以我选用了java提供的Calendar类,和安卓的gridView组合的形式.
先看效果图:
背景什么的先不要管他。只看主体部分,左箭头查看上个月的,右箭头查看下个月的.
接下来开始我们的日历。
首先,需要使用Calendar自己构造一个DateUtils类,这个相当简单。
import java.util.Calendar; /** * Created by 91905 on 2016/8/22 0022. */ public class DateUtils { /** * 获取当前年份 * * @return */ public static int getYear() { return Calendar.getInstance().get(Calendar.YEAR); } /** * 获取当前月份 * * @return */ public static int getMonth() { return Calendar.getInstance().get(Calendar.MONTH) + 1; } /** * 获取当前日期是该月的第几天 * * @return */ public static int getCurrentDayOfMonth() { return Calendar.getInstance().get(Calendar.DAY_OF_MONTH); } /** * 获取当前日期是该周的第几天 * * @return */ public static int getCurrentDayOfWeek() { return Calendar.getInstance().get(Calendar.DAY_OF_WEEK); } /** * 获取当前是几点 */ public static int getHour() { return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);//二十四小时制 } /** * 获取当前是几分 * * @return */ public static int getMinute() { return Calendar.getInstance().get(Calendar.MINUTE); } /** * 获取当前秒 * * @return */ public static int getSecond() { return Calendar.getInstance().get(Calendar.SECOND); } /** * 根据传入的年份和月份,获取当前月份的日历分布 * * @param year * @param month * @return */ public static int[][] getDayOfMonthFormat(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1);//设置时间为每月的第一天 //设置日历格式数组,6行7列 int days[][] = new int[6][7]; //设置该月的第一天是周几 int daysOfFirstWeek = calendar.get(Calendar.DAY_OF_WEEK); //设置本月有多少天 int daysOfMonth = getDaysOfMonth(year, month); //设置上个月有多少天 int daysOfLastMonth = getLastDaysOfMonth(year, month); int dayNum = 1; int nextDayNum = 1; //将日期格式填充数组 for (int i = 0; i < days.length; i++) { for (int j = 0; j < days[i].length; j++) { if (i == 0 && j < daysOfFirstWeek - 1) { days[i][j] = daysOfLastMonth - daysOfFirstWeek + 2 + j; } else if (dayNum <= daysOfMonth) { days[i][j] = dayNum++; } else { days[i][j] = nextDayNum++; } } } return days; } /** * 根据传入的年份和月份,判断上一个有多少天 * * @param year * @param month * @return */ public static int getLastDaysOfMonth(int year, int month) { int lastDaysOfMonth = 0; if (month == 1) { lastDaysOfMonth = getDaysOfMonth(year - 1, 12); } else { lastDaysOfMonth = getDaysOfMonth(year, month - 1); } return lastDaysOfMonth; } /** * 根据传入的年份和月份,判断当前月有多少天 * * @param year * @param month * @return */ public static int getDaysOfMonth(int year, int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: if (isLeap(year)) { return 29; } else { return 28; } case 4: case 6: case 9: case 11: return 30; } return -1; } /** * 判断是否为闰年 * * @param year * @return */ public static boolean isLeap(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return true; } return false; } }
其中DateUtils类中的
public static int[][] getDayOfMonthFormat(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1);//设置时间为每月的第一天 //设置日历格式数组,6行7列 int days[][] = new int[6][7]; //设置该月的第一天是周几 int daysOfFirstWeek = calendar.get(Calendar.DAY_OF_WEEK); //设置本月有多少天 int daysOfMonth = getDaysOfMonth(year, month); //设置上个月有多少天 int daysOfLastMonth = getLastDaysOfMonth(year, month); int dayNum = 1; int nextDayNum = 1; //将日期格式填充数组 for (int i = 0; i < days.length; i++) { for (int j = 0; j < days[i].length; j++) { if (i == 0 && j < daysOfFirstWeek - 1) { days[i][j] = daysOfLastMonth - daysOfFirstWeek + 2 + j; } else if (dayNum <= daysOfMonth) { days[i][j] = dayNum++; } else { days[i][j] = nextDayNum++; } } } return days; }
是将当前月份的日期分布保存到数组中返回.
接下来,布局文件
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:gravity="center"> <ImageView android:id="@+id/record_left" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/record_left_press" /> </LinearLayout> <RelativeLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="2" android:gravity="center"> <TextView android:id="@+id/record_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_gravity="center" android:maxLines="1" android:text="2016年8月21日" android:textColor="@color/colorWhite" android:textSize="16sp" /> </RelativeLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:gravity="center"> <ImageView android:id="@+id/record_right" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/record_right_press" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="日" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="二" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="三" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="四" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="五" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="六" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout> </LinearLayout> <GridView android:id="@+id/record_gridView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp" android:numColumns="7" /> </LinearLayout>
GridView的item文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal"> <TextView android:id="@+id/date_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorWhite" android:textSize="16sp" /> </LinearLayout>
GridView的Adapter文件
import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.jiaoml.smallmusic.MusicApp; import com.jiaoml.smallmusic.R; import com.jiaoml.smallmusic.music.Record; import com.lidroid.xutils.db.sqlite.Selector; import com.lidroid.xutils.db.sqlite.WhereBuilder; import com.lidroid.xutils.exception.DbException; /** * Created by 91905 on 2016/8/24 0024. */ public class DateAdapter extends BaseAdapter { private int[] days = new int[42]; private Context context; private int year; private int month; public DateAdapter(Context context, int[][] days, int year, int month) { this.context = context; int dayNum = 0;
//将二维数组转化为一维数组,方便使用 for (int i = 0; i < days.length; i++) { for (int j = 0; j < days[i].length; j++) { this.days[dayNum] = days[i][j]; dayNum++; } } this.year = year; this.month = month; } @Override public int getCount() { return days.length; } @Override public Object getItem(int i) { return days[i]; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.date_item, null); viewHolder = new ViewHolder(); viewHolder.date_item = (TextView) view.findViewById(R.id.date_item); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } if (i < 7 && days[i] > 20) { viewHolder.date_item.setTextColor(Color.rgb(204, 204, 204));//将上个月的和下个月的设置为灰色 } else if (i > 20 && days[i] < 15) { viewHolder.date_item.setTextColor(Color.rgb(204, 204, 204)); }
viewHolder.date_item.setText(days[i] + ""); return view; } /** * 优化Adapter */ class ViewHolder { TextView date_item; }
接下来是Activity文件
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import com.jiaoml.smallmusic.R; import com.jiaoml.smallmusic.adapter.DateAdapter; /** * Created by 91905 on 2016/8/24 0024. */ public class MainActivity extends Activity implements View.OnClickListener { private GridView record_gridView;//定义gridView private DateAdapter dateAdapter;//定义adapter private ImageView record_left;//左箭头 private ImageView record_right;//右箭头 private TextView record_title;//标题 private int year; private int month; private String title; private int[][] days = new int[6][7]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化日期数据 initData(); //初始化组件 initView(); //组件点击监听事件 initEvent(); } private void initData() { year = DateUtils.getYear(); month = DateUtils.getMonth(); } private void initEvent() { record_left.setOnClickListener(this); record_right.setOnClickListener(this); } private void initView() { /** * 以下是初始化GridView */ record_gridView = (GridView) findViewById(R.id.record_gridView); days = DateUtils.getDayOfMonthFormat(2016, 8); dateAdapter = new DateAdapter(this, days, year, month);//传入当前月的年 record_gridView.setAdapter(dateAdapter); record_gridView.setVerticalSpacing(60); record_gridView.setEnabled(false); /** * 以下是初始化其他组件 */ record_left = (ImageView) findViewById(R.id.record_left); record_right = (ImageView) findViewById(R.id.record_right); record_title = (TextView) findViewById(R.id.record_title); } /** * 下一个月 * * @return */ private int[][] nextMonth() { if (month == 12) { month = 1; year++; } else { month++; } days = DateUtils.getDayOfMonthFormat(year, month); return days; } /** * 上一个月 * * @return */ private int[][] prevMonth() { if (month == 1) { month = 12; year--; } else { month--; } days = DateUtils.getDayOfMonthFormat(year, month); return days; } /** * 设置标题 */ private void setTile() { title = year + "年" + month + "月"; record_title.setText(title); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.record_left: days = prevMonth(); dateAdapter = new DateAdapter(this, days, year, month); record_gridView.setAdapter(dateAdapter); dateAdapter.notifyDataSetChanged(); setTile(); break; case R.id.record_right: days = nextMonth(); dateAdapter = new DateAdapter(this, days, year, month); record_gridView.setAdapter(dateAdapter); dateAdapter.notifyDataSetChanged(); setTile(); break; } } }
OK,一个简单的日历就完成了
作者:jiaomenglei 发表于2016/8/24 17:02:01 原文链接
阅读:16 评论:0 查看评论