Android 自定義實現日曆
阿新 • • 發佈:2018-12-11
開發工具AndroidStudio,使用元件GridView
實現步驟以及原理
- 通過Calendar獲取當前年月日
- 獲取指定年月的天數
- 得到當月一號是星期幾
- 獲取日期物件的列表資料:當月天數加上當月1號星期幾之前的空白資料(比如1號是星期3,那麼日期列表資料之前新增三個資料)
- 設定GridView的介面卡
具體實現
- 用Calendar物件獲取日期
Calendar calendar = Calendar.getInstance(); currYear = calendar.get(Calendar.YEAR); currMouth = calendar.get(Calendar.MONTH);
- 獲取對應年月的天數
private int getMonthLastDay(int year, int month) { Calendar a = Calendar.getInstance(); a.set(Calendar.YEAR, year); a.set(Calendar.MONTH, month - 1); a.set(Calendar.DATE, 1);//把日期設定為當月第一天 a.roll(Calendar.DATE, -1);//日期回滾一天,也就是最後一天 return a.get(Calendar.DATE); }
- 一號是星期幾
Calendar calendar = Calendar.getInstance(); int currYear = calendar.get(Calendar.YEAR); int currMouth = calendar.get(Calendar.MONTH) + 1; int currDay = calendar.get(Calendar.DAY_OF_MONTH); calendar.set(year, mouth - 1, 0); int i1 = calendar.get(Calendar.DAY_OF_WEEK);//這就是星期幾
- 得到日期資料列表
public void requestData() {
last_state = 0;
state_count = 0;
ArrayList<DateInfo> datas = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
int currYear = calendar.get(Calendar.YEAR);
int currMouth = calendar.get(Calendar.MONTH) + 1;
int currDay = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(year, mouth - 1, 0);
int i1 = calendar.get(Calendar.DAY_OF_WEEK);
if (i1 > 6)//如果大於6天,也就是一個星期的天數,就不用新增,否則顯示一行空白
i1 = 0;
for (int i = 0; i < i1; i++) {
datas.add(new DateInfo(true));
}
for (int i = 0; i < getMonthLastDay(year, mouth); i++) {
DateInfo data = new DateInfo(year, mouth, i + 1);
if (currYear == year && currMouth == mouth && currDay == i + 1)
data.setToday(true);
data.setState(new Random().nextInt(4));//設定這一天的狀態的
if (last_state == 0) {
last_state = data.getState();
state_count = 1;
} else if (last_state == data.getState()) {
++state_count;
datas.get(i + i1 - 1).setState_count(state_count);
data.setState_count(state_count);
} else {
last_state = data.getState();
state_count = 1;
}
datas.add(data);
}
}
- 最後繼承自BaseAdapter,設定GridView的介面卡