Android自定义布局的日历的例子

系统自带的日历虽然好用,但是不符合某些项目的需求,所以需要自定义布局,看网上许多自定义View完成自定义日历的,

自认水平不够,无法驾驭,所以采用gridview来实现。

CalendarUtils:(获取当前年月对应的数据数组)

package kyle.com.zujian;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
/**
 * Created by kyle on 2016/8/12 0012.
 * 获取某年某月的日期,界面上第一天为周日
 * 通过传的年和月,获取对应年月的日期和第一天是周几
 */
public class CalendarUtils {
    private static int FIRST_DAY_OF_WEEK;//第一天
    private static Calendar calendar;//日历
 
 
    public static List<DateEntity> getDate(int year, int month) {
        if (year <= 0 || month < 1 || month > 12) {
            return new ArrayList<>();//当年和月不符合规则时,返回空list
        }
        List<DateEntity> dates = new ArrayList<>();
        calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);//设置年
        calendar.set(Calendar.MONTH, month - 1);//设置月
        calendar.set(Calendar.DAY_OF_MONTH, 1);//设置第一天
        FIRST_DAY_OF_WEEK = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获得第一天是周几 0:周日 6周六
        for (int i = 0; i < FIRST_DAY_OF_WEEK; i++) {//假设是周日则跳过,假设不是周日,就添加对应数目的空白item
            DateEntity entity = new DateEntity();
            dates.add(entity);
        }
        int count = checkDays(year, month);//获取当前年月的天数
        for (int i = 0; i < count; i++) {
            DateEntity entity2 = new DateEntity(year, month, i + 1);
            dates.add(entity2);
        }
        return dates;
    }
 
    /***
     * 判断当前年月有多少天
     *
     * @param year
     * @param month
     * @return
     */
    private static int checkDays(int year, int month) {
        if (year < 1 || month > 12 || month < 1) {
            return 0;
        }
        switch (month) {
            case 2:
                if (year % 4 == 0) {
                    return 29;
                } else {
                    return 28;
                }
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
        }
        return 0;
    }
}

实体类:DateEntity

package kyle.com.zujian;
 
/**
 * Created by Administrator on 2016/8/9 0009.
 */
public class DateEntity {
    private int year;
    private int month;
    private int day;
 
    @Override
    public String toString() {
        return "DateEntity{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
 
    public DateEntity(){
 
}
    public DateEntity( int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
 
 
    public int getYear() {
        return year;
    }
 
    public void setYear(int year) {
        this.year = year;
    }
 
    public int getMonth() {
        return month;
    }
 
    public void setMonth(int month) {
        this.month = month;
    }
 
    public int getDay() {
        return day;
    }
 
    public void setDay(int day) {
        this.day = day;
    }
}

CalendarGridView:(自定义的gridview,把代码转移到这里面,方便调用.)

package kyle.com.zujian;
 
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
/**
 * Created by kyle on 2016/8/15 0015.
 * 自定义日历gridview
 */
public class CalendarGridView extends GridView {
 
    private Context mContext;
    private List<DateEntity> mList = new ArrayList<>();
    private MyAdapter mAdapter;
    private Calendar calendar;
    /***
     * 今天
     */
    private int NOW_YEAR;//当前年
    private int NOW_MONTH;//当前月
    private int NOW_DAY;//当前日
 
    public CalendarGridView(Context context) {
        super(context, null);
        mContext = context;
    }
 
    public CalendarGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        calendar = Calendar.getInstance();//获取日历实例
        NOW_YEAR = calendar.get(Calendar.YEAR);//当前年
        NOW_MONTH = calendar.get(Calendar.MONTH) + 1;//当前月
        NOW_DAY = calendar.get(Calendar.DAY_OF_MONTH);//当前日
        mAdapter = new MyAdapter();//实例化和设置适配器
        setAdapter(mAdapter);
    }
 
    public void init(int year, int month) {
        if (year < 1 || month < 1 || month > 12) {
            Toast.makeText(mContext, "年份或月份错误!", Toast.LENGTH_SHORT).show();
            return;
        }
        mList.clear();
        for (DateEntity entity : CalendarUtils.getDate(year, month)) {
            mList.add(entity);
        }
        mAdapter.notifyDataSetChanged();
    }
 
    private class MyAdapter extends BaseAdapter {
 
        @Override
        public int getCount() {
            return mList.size();
        }
 
        @Override
        public Object getItem(int position) {
            return mList.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyHolder holder;
            if (convertView == null) {
                convertView = View.inflate(mContext, R.layout.item_grid, null);
                holder = new MyHolder();
                holder.llMain = (LinearLayout) convertView.findViewById(R.id.ll_main);
                holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);
                holder.tvCount = (TextView) convertView.findViewById(R.id.tv_count);
                convertView.setTag(holder);
            } else {
                holder = (MyHolder) convertView.getTag();
            }
            int year = mList.get(position).getYear();
            int month = mList.get(position).getMonth();
            int day = mList.get(position).getDay();
            if (year == NOW_YEAR && month == NOW_MONTH && day == NOW_DAY) {
                holder.llMain.setBackgroundResource(R.color.red);
                holder.tvDate.setTextColor(ContextCompat.getColor(mContext, R.color.white));
                holder.tvCount.setTextColor(ContextCompat.getColor(mContext, R.color.white));
            } else {
                holder.llMain.setBackgroundResource(R.color.white);
                holder.tvDate.setTextColor(ContextCompat.getColor(mContext, R.color.black));
                holder.tvCount.setTextColor(ContextCompat.getColor(mContext, R.color.black));
            }
            if (day != 0) {
                holder.tvDate.setText(mList.get(position).getDay() + "");
            } else {
                holder.tvDate.setText("");
            }
            return convertView;
        }
    }
 
    private class MyHolder {
        private LinearLayout llMain;
        private TextView tvDate;
        private TextView tvCount;
    }
}

在Activity里面这样调用:

CalendarGridView mGv= (CalendarGridView) findViewById(R.id.gv);
mGv.init(2016,8);
 

当然,布局和实体类都可以自己去根据需求写,而如果想要真正的日历功能,则可以使用viewpager+fragment实现了

时间: 2024-07-30 04:57:59

Android自定义布局的日历的例子的相关文章

ontochevent事件冲突-Android 自定义布局和自定义view的onTochEvent时间冲突

问题描述 Android 自定义布局和自定义view的onTochEvent时间冲突 我自定义了一个布局和一个view,自定义view被布局引用.view和布局都重写了他的onTochEvent方法,然后发现布局的onTochEvent方法无法被执行被view的onTochEvent 拦截了,请问怎么解决. 解决方案 使自定义view来拦截touch事件即可 onInterceptTouchEvent 解决方案二: 刚好最近写了一篇关于View事件冲突的文章,你看看http://blog.csd

Android 自定义布局竖向的ViewPager的实现

Android 自定义布局竖向的ViewPager的实现 效果图: 这个自定义控件涉及到的知识点: 自定义ViewGroup中onMeasure和onLayout的写法 弹性滚动Scroller的用法 速度轨迹追踪器VelocityTracker的用法 如何处理滑动事件冲突 dispatchTouchEvent:(外部拦截)告诉此ScrollLayout的父布局,什么时候该拦截触摸事件,什么时候不该拦截触摸事件 onInterceptTouchEvent:(内部拦截)ScrollLayout告诉

Android自定义可标记日历效果

先直接看看效果吧 初始情况 点击一个作为标记 再次点击后删除 3.这里还要感谢前辈的代码作为参考,毕竟以前也没有写过关于日历方面的东西,别人确实写得不错,我在原基础上加入了数据库操作等补充,以完成自己实际需求,作为尊重首先给出原作者的连接 就是这里–>Android自定义控件实现可多选课程日历CalendarView 4.然后贴出来关于数据库操作的代码,给大家作为参考 DatabaseHelper .java 这是关于简单数据库操作的部分 package com.xugongming38.edi

Android不使用自定义布局情况下实现自定义通知栏图标的方法_Android

本文实例讲述了Android不使用自定义布局情况下实现自定义通知栏图标的方法.分享给大家供大家参考,具体如下: 自定义通知栏图标?不是很简单么.自定义布局都不在话下! 是的,有xml布局文件当然一切都很简单,如果不给你布局文件用呢? 听我慢慢道来! 首先怎么创建一个通知呢? 1.new 一个 复制代码 代码如下: Notification n = new Notification(android.R.drawable.ic_menu_share, null, System.currentTime

android自定义 iew-有没有Android中自定义布局的详细教程!

问题描述 有没有Android中自定义布局的详细教程! 有没有Android中自定义布局的详细教程!我想写一个课程表布局,在网上找了几个demo,但是里面的自定义布局看不明白! 解决方案 Composite View Composite views (也被称为 compound views) 是众多将多个view结合成为一个可重用UI组件的方法中最简单的.这种方法的实现过程是这样的: 继承相关的内建的布局. 在构造函数里面填充一个 merge 布局. 初始化成员变量并通过 findViewByI

Android自定义日历控件实例详解_Android

为什么要自定义控件 有时,原生控件不能满足我们对于外观和功能的需求,这时候可以自定义控件来定制外观或功能:有时,原生控件可以通过复杂的编码实现想要的功能,这时候可以自定义控件来提高代码的可复用性. 如何自定义控件 下面我通过我在github上开源的Android-CalendarView项目为例,来介绍一下自定义控件的方法.该项目中自定义的控件类名是CalendarView.这个自定义控件覆盖了一些自定义控件时常需要重写的一些方法. 构造函数 为了支持本控件既能使用xml布局文件声明,也可在ja

Android自定义日历Calender代码实现_Android

产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件  (2)然后就是你需要设置的属性等的,在attrs文件夹中  (3)然后就是在类里边进行属性的设置以及布局等等功能的添加  其实自定义一个日历问题都不多,很多人都会想到通过一个gridView然后填充就可以,确实是这样,主要是在显示每个月的第一天的位置以及每个月显示多少天有点绕. 思路:通过判断当前星期几然后进行日历的填充,

Android自定义日历Calender代码实现

产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的属性等的,在attrs文件夹中 (3)然后就是在类里边进行属性的设置以及布局等等功能的添加 其实自定义一个日历问题都不多,很多人都会想到通过一个gridView然后填充就可以,确实是这样,主要是在显示每个月的第一天的位置以及每个月显示多少天有点绕. 思路:通过判断当前星期几然后进行日历的填充,但是填

组合-android自定义view怎样指定自定义view的布局

问题描述 android自定义view怎样指定自定义view的布局 我有现成的布局xml文件,现在想定义一个组合的自定义view,怎样把这个view的布局指定为一个xml文件 解决方案 LayoutInflater.from(mActivity).inflate(R.layout.mainscreen_title, this, true);这样就行了,this是当前的View,而后面这两个参数是将R.layout.mainscreen_title attachToRoot 也就是以当前这个Vie