使用GrideView实现日历控件

使用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;
        }
    }
}

以上就是所有的实现的部分。
源码下载

猜你喜欢

转载自blog.csdn.net/xadlovezy/article/details/72991289
今日推荐