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 getDate() {return Calendar.getInstance().get(Calendar.DATE);}/*** 根据传入的年份和月份,获取当前月份的日历分布** @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;}
}
public class DateAdapter extends BaseAdapter {private int[] days = new int[42];private Context context;private int year;private int month;private int index;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++;}}index = DateUtils.getDate();this.year = year;this.month = month;}@Overridepublic int getCount() {return days.length;}@Overridepublic Object getItem(int i) {return days[i];}@Overridepublic long getItemId(int i) {return i;}@Overridepublic 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] + "");viewHolder.date_item.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {index = i;notifyDataSetChanged();Toast.makeText(context, year + "年" + month + "月" + days[i], Toast.LENGTH_SHORT).show();}});if (i == index) {viewHolder.date_item.setBackgroundResource(R.drawable.redbg);viewHolder.date_item.setTextColor(context.getResources().getColor(R.color.main_bg));} else {viewHolder.date_item.setBackgroundResource(R.color.main_bg);viewHolder.date_item.setTextColor(context.getResources().getColor(R.color.txt0));}return view;}/*** 优化Adapter*/class ViewHolder {TextView date_item;}
}

date_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="vertical"><TextViewandroid:id="@+id/date_item"android:layout_width="20dp"android:layout_height="20dp"android:text="28"android:gravity="center"android:textSize="12dp" /></LinearLayout>
public class MainActivity extends AppCompatActivity {@BindView(R.id.left_year)ImageView leftYear;@BindView(R.id.record_left)ImageView recordLeft;@BindView(R.id.record_title)TextView recordTitle;@BindView(R.id.record_right)ImageView recordRight;@BindView(R.id.right_year)ImageView rightYear;@BindView(R.id.record_gridView)GridView recordGridView;private int year;private int month;private String title;private int[][] days = new int[6][7];private DateAdapter dateAdapter;//定义adapter@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);//初始化日期数据initData();//初始化组件initView();}private void initData() {year = DateUtils.getYear();month = DateUtils.getMonth();}private void initView() {/*** 以下是初始化GridView*/days = DateUtils.getDayOfMonthFormat(2016, 8);dateAdapter = new DateAdapter(this, days, year, month);//传入当前月的年recordGridView.setAdapter(dateAdapter);recordGridView.setVerticalSpacing(60);recordGridView.setEnabled(false);setTile();}/*** 设置标题*/private void setTile() {title = year + "年" + month + "月";recordTitle.setText(title);}@OnClick({R.id.record_left, R.id.left_year, R.id.right_year, R.id.record_right})public void onViewClicked(View view) {switch (view.getId()) {case R.id.left_year:days = prevyear();dateAdapter = new DateAdapter(this, days, year, month);recordGridView.setAdapter(dateAdapter);dateAdapter.notifyDataSetChanged();setTile();break;case R.id.right_year:days = nextyear();dateAdapter = new DateAdapter(this, days, year, month);recordGridView.setAdapter(dateAdapter);dateAdapter.notifyDataSetChanged();setTile();break;case R.id.record_left:days = prevMonth();dateAdapter = new DateAdapter(this, days, year, month);recordGridView.setAdapter(dateAdapter);dateAdapter.notifyDataSetChanged();setTile();break;case R.id.record_right:days = nextMonth();dateAdapter = new DateAdapter(this, days, year, month);recordGridView.setAdapter(dateAdapter);dateAdapter.notifyDataSetChanged();setTile();break;}}/*** 下一个月** @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;}/*** 下一年** @return*/private int[][] nextyear() {year++;days = DateUtils.getDayOfMonthFormat(year, month);return days;}/*** 上一年** @return*/private int[][] prevyear() {year--;days = DateUtils.getDayOfMonthFormat(year, month);return days;}}

activity_main

<?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"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/main_bg"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/left_year"android:layout_width="wrap_content"android:layout_height="match_parent"android:padding="10dp"android:src="@mipmap/icon_left" /><ImageViewandroid:id="@+id/record_left"android:layout_width="wrap_content"android:layout_height="match_parent"android:padding="10dp"android:src="@mipmap/icon_left" /><TextViewandroid:id="@+id/record_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:maxLines="1"android:text=""android:textColor="@color/txt0"android:textSize="16sp" /><ImageViewandroid:id="@+id/record_right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:src="@mipmap/icon_right" /><ImageViewandroid:id="@+id/right_year"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:src="@mipmap/icon_right" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"android:layout_marginRight="20dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="日"android:textColor="#ffff0000"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="一"android:textColor="@color/txt0"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="二"android:textColor="@color/txt0"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="三"android:textColor="@color/txt0"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="四"android:textColor="@color/txt0"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="五"android:textColor="@color/txt0"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="六"android:textColor="#ffff0000"android:textSize="16sp" /></LinearLayout><GridViewandroid:id="@+id/record_gridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="20dp"android:numColumns="7" /></LinearLayout></LinearLayout>

点击demo链接

Android自定义日历可切换年,月相关推荐

  1. Android自定义日历控件,自带农历节假日,已经开源,即取即用~

    关注本人的更多博客:http://www.cnblogs.com/liushilin/ 该自定义日历控件已经开源:github地址 可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多, ...

  2. android 自定义日历 数据,Android实现自定义日历.pdf

    Android实实现现自自定定义义日日历历 自定义日历类源码,可以自己在里面按照需求增减功能,做成自己想要的日历效果,小伙伴们可以根据自己的需求自 由 改 自定义日历控件,支持旧历.节气.日期标注.点 ...

  3. Android定制日历,支持周月切换,日期标记,农历显示,节假日

    公司项目需要一个功能全面的日历,然后就在网上找demo,然后根据demo自己深度定制了一个日历,基本满足了需求,现在把日历核心代码共享给大家.源码下载地址http://download.csdn.ne ...

  4. 自定义日历控android,Android自定义日历Calender代码实现

    产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的 ...

  5. android日历编程,Android自定义日历Calender代码实现

    产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的 ...

  6. Android 自定义日历

    好久没来写博客了,这半年多发生了好多的事情,废话不多说,今天在公司里比较闲在,写一篇最近写的公司用到的控件--日历控件. 控件的功能比较少,根据需求只有选择开始时间和结束时间并返回时间段. 效果图如下 ...

  7. Android自定义日历源码收集

    概述 以前在一家OA公司的时候,做的第一个项目便是日程模块,当时由于对OA理解 的偏差,写了很多无用的代码和逻辑,也走了很多的弯路.几年过去了,现在回想起来还历历在目,今天给大家收集了一些关于日历.日 ...

  8. 可能是第十好的Android 开源 日历 Calendar 仿小米

    SuperCalendar 简介 博主现在工作在一家教育公司,最近公司的产品狗扔过来一个需求,说要做一个可以周月切换的课表,可以展示用户在某一天的上课安排.接到这个任务之后我研究了很多的日历控件,并且 ...

  9. layui totalRow 多层嵌套json_自定义 Behavior,实现嵌套滑动、平滑切换周月视图的日历...

    使用 CoordinateLayout 可以协调它的子布局,实现滑动效果的联动,它的滑动效果由 Behavior 实现.以前用过小米日历,对它滑动平滑切换日月视图的效果印象深刻.本文尝试用自定义 Be ...

最新文章

  1. 公开课报名 | 基于自定义模板的OCR结果的结构化处理技术
  2. 删除或卸载以前添加的库:cocoapods
  3. linux shell seq 序列生成命令 可用于for循环 简介
  4. redis 一般启动几个 哨兵_Redis 5.0.8 主从+哨兵的搭建
  5. php-fpm 内存 facebook,【百家号】脸书百科,安装php-fpm-5.4.16-42.遇到的小问题 Web程序 - 贪吃蛇学院-专业IT技术平台...
  6. Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了!
  7. 定位20万个星系只需10秒!这款AI神器带你撩开宇宙面纱
  8. oracle tovarchar2_Oracle 数据类型转换之 varchar2,number,date
  9. tp5模板使用php函数,tp5 自定义公共函数,前台模板调用
  10. background-position取值笔记
  11. [转]Fedora用root登录
  12. filezilla检查新版本mac_filezilla中文版mac下载
  13. 视频教程-通俗易懂的RPC框架Dubbo视频教程-Java
  14. POJ 1862: Stripies
  15. magento 开发 -- 入门深入理解第五章 – Magento资源配置
  16. 车辆VIN码的校验算法
  17. 应用MIME将ZPT内容输出为excel文件(word文件)
  18. excel表格计算年龄_在Excel中计算年龄
  19. 微信iOS长按无法识别二维码
  20. Strippednot stripped

热门文章

  1. HTML5开发手机项目总结【很好】
  2. 乐视盒子刷入乐视TV的rom
  3. 我的公号正式更名,公布中奖名单,几点活动展开的话题
  4. 你的涂鸦活了,CMU中国本科生让画成真丨有代码有Demo
  5. Day108.尚医通:医院模拟系统接口对接 - 医院|科室|排班 增删改分页条件查询
  6. 深入理解数据压缩与重复数据删除
  7. 阿里内部从初级程序员到架构师学习路线+配套学习资源
  8. 大数据毕业设计 招聘网站数据分析可视化 - python flask 网络爬虫
  9. python中文语义分析_Python中好用的中文语义分析系统——bosonnlp
  10. 119.【Uniapp】