使用GrideView实现日历控件
在日常使用很app中都看到日历控件的身影,如签到。
像这样的一个日历控件我们该如何实现呢?
其实实现非常简单使用我们的GrideView就可以轻松实现。下面我们来实现它吧!
首页我建立一个xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.uztek.myapplication.MainActivity">
<LinearLayout
android:id="@+id/day_of_week"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="日" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="一" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="二" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="三" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="四" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="五" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="5dp"
android:text="六" />
</LinearLayout>
<GridView
android:id="@+id/date_gd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="7"></GridView>
</LinearLayout>
第二步 是我们的代码实现部分
先创建一个单个日期的实体类
package com.uztek.myapplication;
/**
* Created by xingandong on 2017/6/10.
*/
public class DateBean {
public enum DateType {
LAST_MONTH, //前一个前月
CURRENT_MONTH, //当前月
NEXT_MONTH //下的月
}
private DateType dateType; //日期的数值
private int dateValue;
public DateType getDateType() {
return dateType;
}
public void setDateType(DateType dateType) {
this.dateType = dateType;
}
public int getDateValue() {
return dateValue;
}
public void setDateValue(int dateValue) {
this.dateValue = dateValue;
}
}
接下来是Activity部分
package com.uztek.myapplication;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<DateBean> dateBeanList = new ArrayList<>();
private GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = (GridView) findViewById(R.id.date_gd);
initDateValue();
gridView.setAdapter(new CalendarAdapter());
}
private void initDateValue() {
Calendar calendar = Calendar.getInstance();
//第一部分,计算出当月1号是一周的第几天,补齐第一行7列
Calendar calendar1 = (Calendar) calendar.clone();
calendar1.set(Calendar.DAY_OF_MONTH, 1);
int dayofweek = calendar1.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < dayofweek - 1; i++) {
calendar1.add(Calendar.MONTH, -1);
int maxDayofMonth = calendar1.getMaximum(Calendar.DAY_OF_MONTH);
DateBean dateBean = new DateBean();
dateBean.setDateType(DateBean.DateType.LAST_MONTH);
// dateBean.setDateValue(maxDayofMonth - i);
dateBean.setDateValue(0);
dateBeanList.add(0, dateBean);
}
//第二部分,添加当前月的数据
int current_maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = 1; i <= current_maxDay; i++) {
DateBean dateBean = new DateBean();
dateBean.setDateType(DateBean.DateType.CURRENT_MONTH);
dateBean.setDateValue(i);
dateBeanList.add(dateBean);
}
Calendar calendar2 = (Calendar) calendar.clone();
calendar2.set(Calendar.DAY_OF_MONTH, current_maxDay);
dayofweek = calendar2.get(Calendar.DAY_OF_WEEK);
//第三部分,添加当前月的最后一天是一周的第几天,补齐最后一行7列
for (int i = 0; i < 7 - dayofweek; i++) {
calendar2.add(Calendar.MONTH, 1);
DateBean dateBean = new DateBean();
dateBean.setDateType(DateBean.DateType.NEXT_MONTH);
dateBean.setDateValue(0);
// dateBean.setDateValue(i + 1);
dateBeanList.add(dateBean);
}
System.out.print(dateBeanList);
}
class CalendarAdapter extends BaseAdapter {
@Override
public int getCount() {
return dateBeanList.size();
}
@Override
public DateBean getItem(int position) {
return dateBeanList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(MainActivity.this, R.layout.calendar_item, null);
}
Calendar calendar = Calendar.getInstance();
DateBean dateBean = getItem(position);
TextView view = (TextView) convertView.findViewById(R.id.date_tv);
if(dateBean.getDateValue()==0){
view.setText("");
}else{
view.setText(dateBean.getDateValue() + "");
}
int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
if (dateBean.getDateType() == DateBean.DateType.LAST_MONTH) {
view.setTextColor(Color.GRAY);
}
if (dateBean.getDateType() == DateBean.DateType.NEXT_MONTH) {
view.setTextColor(Color.BLACK);
}
if (dateBean.getDateType() == DateBean.DateType.CURRENT_MONTH) {
Calendar tempCalendar = (Calendar) calendar.clone();
tempCalendar.set(Calendar.DAY_OF_MONTH, dateBean.getDateValue());
if (calendar.before(tempCalendar)) {
view.setTextColor(Color.BLACK);
} else {
view.setTextColor(Color.GRAY);
}
if (currentDay == dateBean.getDateValue()) {
view.setText("今");
view.setTextColor(Color.RED);
}
}
return convertView;
}
}
}
以上就是所有的实现的部分。
源码下载