andorid 日历选择器

 先看效果图:


主要代码 

package com.example.flyimport android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Dateclass JCalendarView(context: Context, attributeSet: AttributeSet) :FrameLayout(context, attributeSet) {private var lastTv: ImageView? = nullprivate  var nextTv:ImageView? = nullprivate var dateTv: TextView? = nullprivate  var nowTv:TextView? = nullprivate var calendarRv: RecyclerView? = nullprivate val addYear = 0private var mAdapter: CalendarAdapter=CalendarAdapter()@SuppressLint("SimpleDateFormat")private val sdf = SimpleDateFormat("yyyy-MM-dd") //日期格式化private val mCalendar = Calendar.getInstance() //日历控件初始化init {initView(context)}private fun initView(context: Context) {val inflater = LayoutInflater.from(context)inflater.inflate(R.layout.layout_calendar, this)lastTv = findViewById(R.id.lastTv)nextTv = findViewById(R.id.nextTv)dateTv = findViewById(R.id.dateTv)calendarRv = findViewById(R.id.recyclerView)nowTv = findViewById(R.id.tv_now)calendarRv!!.layoutManager = GridLayoutManager(context, 7)calendarRv!!.adapter = mAdapterinitData()nowTv!!.setOnClickListener { v: View? ->val date = Date()mCalendar.time = dateval datess = sdf.format(date)mAdapter.setSelectDate(Integer.valueOf(datess.substring(8)))initData()}nextTv!!.setOnClickListener { v: View? ->mCalendar.add(Calendar.MONTH, +1) //月份+1initData()}//“上一个”点击事件lastTv!!.setOnClickListener { v: View? ->mCalendar.add(Calendar.MONTH, -1) //月份-1initData()}}@SuppressLint("SetTextI18n")private fun initData() {val datess = sdf.format(mCalendar.time)dateTv!!.text ="${datess.substring(0, 4)} | ${datess.substring(5, 7)} . ${datess.substring(8) }"val cells = ArrayList<Date>()val calendar = mCalendar.clone() as Calendar //克隆日历对象calendar[Calendar.DAY_OF_MONTH] = 1 //置于当月第一天;val prevDays = calendar[Calendar.DAY_OF_WEEK] - 1 //获取上个月最后一天是星期几calendar.add(Calendar.DAY_OF_MONTH, -prevDays) //第一天
//        //获取每月有几周
//        int actualMaximum = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
//        int maxCount = actualMaximum * 7;  //设置每个月最大天数//循环存入集合中while (cells.size < 35) {cells.add(calendar.time)calendar.add(Calendar.DAY_OF_MONTH, 1) //日期+1}//判断当月的最后一天是否在集合里面val cal = mCalendar.clone() as Calendarcal.add(Calendar.MONTH, 0)cal[Calendar.DAY_OF_MONTH] = cal.getActualMaximum(Calendar.DAY_OF_MONTH)val preMonth = cal.timeif (!cells.contains(preMonth)) {for (i in 0..6) {cells.add(calendar.time)calendar.add(Calendar.DAY_OF_MONTH, 1)}}mAdapter.submitList(cells)mAdapter.setmListener(object : CalendarAdapter.OnItemClickListener {override fun onItemClick(v: View?, position: Int, data: String?) {dateTv!!.text ="${data!!.substring(0, 4)} | ${data.substring(5, 7)} . ${data.substring(8) }"}})}
}class CalendarAdapter : RecyclerView.Adapter<CalendarAdapter.ViewHolder>() {private var mList: List<Date> = ArrayList()private var mSelectPosition = -1// 创建一个接口来处理点击事件interface OnItemClickListener {fun onItemClick(v: View?, position: Int, data: String?)}private var mDay = 0private var mListener: OnItemClickListener? = nullfun setmListener(mListener: OnItemClickListener?) {this.mListener = mListener}@SuppressLint("NotifyDataSetChanged")fun submitList(list: List<Date>) {mList = listnotifyDataSetChanged()}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_calendar, parent, false))}override fun onBindViewHolder(holder: ViewHolder, position: Int) {@SuppressLint("SimpleDateFormat")val mDate = SimpleDateFormat("yyyy-MM-dd").format(mList[position])//2023-11-13val day = mDate.substring(8).toInt()val month = mDate.substring(5, 7).toInt()val year = mDate.substring(0, 4).toInt()var isTheSameMonth = false //是否与当前月份相同if (month == getNowMonth()) {  //月份相同isTheSameMonth = true}//若显示的日期月份与当前月份相同,则设置字体颜色是黑色if (isTheSameMonth) {holder.itemTv.setTextColor(Color.parseColor("#333333"))} else {holder.itemTv.setTextColor(Color.parseColor("#999999"))}if (day == 1) {if (month == getNowMonth()) {holder.itemTv.setText(getNowMonth().toString() + "月")} else {val months: Int = getNowMonth() + 1holder.itemTv.text = if (months > 12) 1.toString() + "月" else months.toString() + "月"}holder.itemTv.setTextColor(Color.parseColor("#E71421"))} else {holder.itemTv.text = day.toString()}//设置当前日期字体为红色if (getNowDay() == day && getNowMonth() == month && getNowYear() == year) {holder.itemTv.setTextColor(Color.parseColor("#E71421"))holder.layout.setBackgroundResource(R.drawable.shape_ffe2e1_rounded_20dp)} else {holder.layout.setBackgroundColor(Color.WHITE)}if (position == mSelectPosition) {holder.itemTv.setTextColor(Color.parseColor("#ffffff"))holder.layout.setBackgroundResource(R.drawable.shape_e71421_rounded_20dp)}if (day == mDay) {holder.itemTv.setTextColor(Color.parseColor("#ffffff"))holder.layout.setBackgroundResource(R.drawable.shape_e71421_rounded_20dp)}holder.layout.setOnClickListener { v: View? ->
//                    setSelectPostion(position);setSelectDate(day)mListener?.onItemClick(v, position, mDate)}}override fun getItemCount(): Int {return mList.size}@SuppressLint("NotifyDataSetChanged")fun setSelectPostion(postion: Int) {mSelectPosition = postionnotifyDataSetChanged()}@SuppressLint("NotifyDataSetChanged")fun setSelectDate(day: Int) {mDay = daynotifyDataSetChanged()}private fun getNowYear(): Int {val calendar = Calendar.getInstance()return calendar[Calendar.YEAR]}private fun getNowMonth(): Int {val calendar = Calendar.getInstance()return calendar[Calendar.MONTH] + 1}private fun getNowDay(): Int {val calendar = Calendar.getInstance()return calendar[Calendar.DAY_OF_MONTH]}class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {var itemTv: TextViewvar layout: LinearLayoutinit {itemTv = itemView.findViewById(R.id.itemTv)layout = itemView.findViewById(R.id.llayout)}}
}

布局文件

1、layout_calendar:

<?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"android:padding="16dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/dateTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="2022年11月"android:layout_gravity="center"android:textColor="#333"android:textSize="14sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_now"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="回到今天"android:textColor="#999"android:layout_gravity="center"android:layout_marginStart="24dp"android:textSize="14sp"android:textStyle="bold" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center_vertical"android:textColor="#999"android:layout_gravity="center"android:layout_marginStart="24dp"android:textSize="14sp"android:textStyle="bold" /><ImageViewandroid:id="@+id/lastTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/icon_gengduo"android:paddingStart="16dp"android:paddingTop="8dp"android:paddingBottom="8dp"android:rotation="180"android:layout_marginEnd="8dp"/><ImageViewandroid:id="@+id/nextTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/icon_gengduo"android:paddingEnd="16dp"android:paddingTop="8dp"android:paddingBottom="8dp"/></LinearLayout><LinearLayoutandroid:id="@+id/weekLl"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal"><TextViewandroid:id="@+id/Tv1"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="日"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv2"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="一"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv3"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="二"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv4"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="三"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv5"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="四"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv6"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="五"android:textColor="#999"android:textSize="14sp" /><TextViewandroid:id="@+id/Tv7"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:gravity="center"android:text="六"android:textColor="#999"android:textSize="14sp" /></LinearLayout><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center" /></LinearLayout>

2、item_calendar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/llayout"android:layout_width="40dp"android:layout_height="40dp"android:gravity="center"android:orientation="vertical"><TextViewandroid:id="@+id/itemTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="1"android:textColor="#999"android:textSize="14sp" /></LinearLayout>

3、shape:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#e71421"/><corners android:radius="20dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="20dp" /><solid android:color="#ffe2e1" />
</shape>

欢迎大家指正不足的地方;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/191372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb Day10 案例 准备工作

目录 一、需求说明 二、环境搭建 &#xff08;一&#xff09;数据库 &#xff08;二&#xff09;后端 ①controller层 1.DeptController.java 2.EmpController.java ②mapper层 1.DeptMapper.java 2.EmpMapper.java ③pojo层 1.Dept.java 2.Emp.java 3.Result.ja…

邻里注意Transformer(CVPR2023)

Neighborhood Attention Transformer 摘要1、介绍2、相关工作2.1 新的卷积基线 3、方法3.1 邻居注意力3.2 Tiled NA and NATTEN3.3 邻居注意力Transformer 4、结论 代码 摘要 我们提出邻居注意力(NA)&#xff0c;第一个有效和可伸缩的滑动窗口的视觉注意机制。 NA是一种像素级…

Django视图函数和资源

文章目录 1.视图1.1 文件or文件夹1.2 相对和绝对导入urls1.3 视图参数1.4 返回值1.5 响应头1.6 FBV和CBV 2.静态资源2.1 静态文件2.2 媒体文件 1.视图 1.1 文件or文件夹 1.2 相对和绝对导入urls 注意实现&#xff1a;不要再项目根目录做相对导入。 原则&#xff1a; 绝对导入…

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案&#xff0c;它由三个核心组件组成&#xff1a; Elasticsearch&#xff1a;作为分布式搜索和分析引擎&#xff0c;Elasticsearch能够快速地存储、搜索和分析大量的日志数据&#xff0c;帮助用户轻松地找到所需的信息。 Logstash&#xf…

Jenkins 构建CICD

GitLab GitLab安装 https://gitlab.cn/install/?versionce CentOS 下安装 1. 安装和配置必须的依赖项 在 CentOS 7上&#xff0c;下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤&#xff0c;如果您打算仅从本地网络访问极狐GitLab&#xf…

上课笔记(11.11之前笔记)

一.数据结构的分类 1.数据结构中分为四大类&#xff1a;线性表&#xff0c;哈希表&#xff0c;树&#xff0c;图。 2.线性表&#xff08;line table&#xff09;&#xff1a;呈现线性结构的一种数据结构。具有顺序性&#xff0c;也就是所有数据都是有序的&#xff1b; 数组&…

Mozilla 面向基于 Debian 的 Linux 发行版

导读Mozilla 公司今天发布新闻稿&#xff0c;表示面向 Debian、Ubuntu 和 Linux Mint 等基于 Debian 的发行版&#xff0c;推出了.deb 格式的 Firefox Nightly 浏览器安装包&#xff0c;便于用户在上述发行版中更轻松地安装。 本次更新的亮点之一在于采用 APT 存储库&#xff0…

C++20 Text formatting

C20 Text formatting 格式化字符串&#xff0c; 和 python 类似。 std::formatter - cppreference.com string — Common string operations — Python 3.12.0 documentation 新格式库位于 <format> 头文件中。格式库基于 Python3 中的 str.format() 方法建模。格式…

css实现元素四周阴影

前言 首先确定的是需要使用box-shadow这一属性 语法如下&#xff1a; box-shadow: h-shadow v-shadow blur spread color inset; h-shadow&#xff1a;表示水平方向上的阴影偏移量&#xff0c;必须指明&#xff0c;可以是正数、负数、0&#xff0c;如果为正数左方有阴影&…

Spring全家桶源码解析--2.3 Spring bean 的依赖注入--@Autowired@Value

文章目录 前言一、Autowired&Value&#xff1a;1.1 Autowired&#xff1a;1.2 Value&#xff1a; 二、依赖注入&#xff1a;2.1 注入点获取&#xff1a;2.2 通过 populateBean 入口依赖注入2.2.1 populateBean &#xff1a;主要通过 postProcessProperties 方法进行依赖注入…

医院安全(不良)事件管理系统源码 不良事件报告全套源码

不良事件管理系统是一种专为企业或组织设计的软件工具&#xff0c;用于跟踪、记录和管理不良事件。该系统可以有效地整合不良事件的收集、分类、分析和报告&#xff0c;帮助企业及时识别和处理不良事件&#xff0c;从而降低风险和损失。通过实时监控和自动化报告&#xff0c;该…

论文精读 MediaPipe Hands

MediaPipe Hands:On-device Real-time Hand Tracking MediaPipe手势&#xff1a;设备上的实时手势跟踪 论文地址&#xff1a;2006.10214.pdf (arxiv.org) 源码地址&#xff1a;GitHub - vidursatija/BlazePalm: PyTorch 目录 摘要 介绍 架构 BlazePalm Detector Hand L…

蓝桥杯算法心得——拼数(排列型回溯dfs)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的dfs&#xff0c;在一些需要暴搜的题中很中很重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .拼数 2) .算法思路 超级递归 1.遍历数组&#…

玩了个锤子游戏小程序搭建流程:探索深度与逻辑的结合

随着移动互联网的普及&#xff0c;小程序已经成为了越来越多用户的选择。在这个背景下&#xff0c;玩了个锤子游戏小程序应运而生&#xff0c;它为用户提供了一个全新的游戏体验。那么&#xff0c;如何搭建这样一个小程序呢&#xff1f;本文将为大家详细介绍玩了个锤子游戏小程…

GoLong的学习之路(二十三)进阶,语法之并发(go最重要的特点)(锁,sync包,原子操作)

这章是我并发系列中最后的一章。这章主要讲的是锁。但是也会讲上一章channl遗留下的一些没有讲到的内容。select关键字的用法&#xff0c;以及错误的一些channl用法。废话不多说。。。 文章目录 select多路复用通道错误示例并发安全和锁问题描述互斥锁读写互斥锁 syncsync.Wait…

go学习之接口知识

文章目录 接口1.接口案例代码展示2.基本介绍3.基本语法4.应用场景介绍5.注意事项和细节6.接口编程经典案例7.接口与继承之间的比较8.面向对象编程--多态1&#xff09;基本介绍2&#xff09;快速入门3&#xff09;接口体现多态的两种形式 9.类型断言1&#xff09;先看一个需求2&…

单独设置echarts图例样式

参考&#xff1a;echarts-legend legend: [{data: [{name: 正常,icon: rect}],itemWidth: 16,itemHeight: 4,top: 6%,left: 35%,textStyle: {color: #626C78,fontSize: 14}},{data: [{name: 异常,icon: rect}],itemWidth: 16,itemHeight: 4,top: 6%,left: 50%,textStyle: {col…

2013年01月16日 Go生态洞察:并发不是并行

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

京东数据运营与分析:如何全面获取电商销售数据?

随着电商行业的快速发展&#xff0c;数据分析成为了电商运营中一个非常重要的环节&#xff0c;这一环往往能够帮助品牌方来提升销售业绩和管理效率。然而&#xff0c;如何获取到电商平台中详细、全面的销售数据是很多电商品牌方所关心的问题&#xff0c;事实上&#xff0c;第三…