高仿钉钉和小米的日历控件

作者: codbking | 来源:发表于2016-12-26 13:03 被阅读12783次

i# 简介
这是一个高仿钉钉和小米的日历控件,支持快速滑动,界面缓存。想要定制化UI,使用起来非常简单,就像使用ListView一样

一些特点:

  1. 可以自定义日历控件UI
  2. 支持快速滑动
  3. 支持农历和阳历
  4. 界面UI缓存和日历数据缓存
  5. 扩展view支持listView的滑动
  6. 左右无限滑动

效果

  • 先上两张demo的效果图,分别是仿小米和钉钉日历效果图
仿小米日历 仿钉钉日历
  • 再看下交互效果
交互动画

how to use

  • Add it in your root build.gradle at the end of repositories:
        allprojects {
           repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
        }
  • Add the dependency
    dependencies {
            compile 'com.github.codbking:CalendarExaple:v1.0.0'
    }
  • 在layout的xml中添加CalendarLayout和CalendarDateView

    注意:CalendarDateView一定是CalendarLayout第一个view,扩展view必须是CalendarDateView第二个view

   <com.codbking.calendar.CalendarLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <com.codbking.calendar.CalendarDateView
            android:id="@+id/calendarDateView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            />

    </com.codbking.calendar.CalendarLayout>
  • 在你的java文件中设置CalendarDateView的CaledarAdapter和CalendarView.OnItemClickListener监听

    注意:想要设置选中效果,只需设置CaledarAdapter中的view的选中背景

       mCalendarDateView.setAdapter(new CaledarAdapter() {
            @Override
            public View getView(View convertView, ViewGroup parentView, CalendarBean bean) {
                //判断convertView为null,可以有效利用view的回收重用,左右滑动的效率高
                if (convertView == null) {
                    convertView = LayoutInflater.from(parentView.getContext()).inflate(R.layout.item_xiaomi, null);
                }

                TextView chinaText = (TextView) convertView.findViewById(R.id.chinaText);
                TextView text = (TextView) convertView.findViewById(R.id.text);

                text.setText("" + bean.day);
                //mothFlag 0是当月,-1是月前,1是月后
                if (bean.mothFlag != 0) {
                    text.setTextColor(0xff9299a1);
                } else {
                    text.setTextColor(0xff444444);
                }
                chinaText.setText(bean.chinaDay);

                return convertView;
            }
        });

        mCalendarDateView.setOnItemClickListener(new CalendarView.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int postion, CalendarBean bean) {
                mTitle.setText(bean.year + "/" + bean.moth + "/" + bean.day);
            }
        });

githup源码 欢迎大家star~哟
apk下载

关于我的其他开源项目

android自定义日期选择控件

联系我

githup:https://github.com/codbking
csdn: http://my.csdn.net/codbking
email:codbking@gmail.com

相关文章

网友评论

  • 五月笑忘:你好我想问一下,我这个只要在页面初始化阶段没有setadapter就会直接闪退,但是我的数据是在进去之后网络请求的,有什么办法可以在网络请求结束后管理页面上的textview的么
  • shunxir:提一个小bug,calendarview measureChild的时候width/column有可能会除不尽会有余数(余数<column),最好把这个余数在分配出去
  • 宇宙只有巴掌大:请问大神我想把周日开头改成周一开头需要怎么做呢?
  • yx梦想成真:请问有没有电脑版的日期控件仿钉钉的
  • d4ef8e250e3e:效果不错,就是代码注释说明太少。。。害我改了个底朝天。。
    596e73492ce6:哈哈哈 戳中笑点
  • f9afd980f5a3:那个listView的item下划线可以去掉吗?还有可以兼容RecyclerView吗?日历的字体颜色可以自由定制吗
  • 秋刀鱼_87c6:挺好的 项目再用了,能不能加下:
    0.当天那条显示其他颜色或文字
    1.快速回到当天
    Hanssss:请教如何快速回到当天。
  • 863498595f2d:请问给某一天添加过东西之后,能不能再日历是有个标记可以看到呀 就像用系统的 日历添加日程后就会有一个点点
  • 七岁就狠拽:这个控件能支持选择年份么?
  • 2f1ab11f8117:弱弱的问一下,有使用js或者js插件实现的大牛吗?
  • d04e066aa2af:项目里行数是固定的6行 通过判断日期数量将row 通过构造传进去之后 数值是对的 但是滑动时 行数的显示错乱了,现在搞不下去了 有大神改成灵活的行数了吗? 望告知,不胜感激。
    神奇的小蘑菇: @bigwalt 按照你的需求 6行和5行的时候日历的高度一样吗?
  • 神奇的小蘑菇:他的问题 我都解决了 https://github.com/MagicMashRoom/SuperCalendar 可以去看看
    神奇的小蘑菇: @圆来是你_d039 你去看看吧 可以
    sdjvsjjsc:@神奇的小蘑菇 支持写入日历事务吗
    sdjvsjjsc:@神奇的小蘑菇 还没看,可以收缩吗
  • Kris_liu:博主你好 这个我想把这个listview放在最下面在日历和listview之间加点其他内容 这个怎么加呢 比如我加个imageview在他之间 就报错闪退了
    d04e066aa2af:listView 添加头部
  • 逆流而鱼:大哥我根本不会用你的东西,没具体说明的
  • 午马丶:有oc版的吗
  • 83856d9b97fe:标题换成 周一 到 周日 怎么转换 数据?
    怜城夏目:@神奇的小蘑菇 请问您的这个日历如何取消选中状态,或者添加这个功能,我现在碰到这样一个需求(第一次点击选中,第二次点击取消选中)
    神奇的小蘑菇:看我的https://github.com/MagicMashRoom/SuperCalendar
  • y丶M1ng:请问下,可以设置左滑右滑的时候日期可以不变吗吗?,左滑右滑的时候日期就变成新的一个月的1号了
    start筑梦:@神奇的小蘑菇 你的这个网址怎么打不开呀
    神奇的小蘑菇:看我的https://github.com/MagicMashRoom/SuperCalendar 我的解决了这个问题
    d04e066aa2af:这个你在 CalendarView 的setItem()方法里 将判断的逻辑稍微改一下就可以实现不点击滑动每月都是当月当前这一天.(不够的日期向前推)
  • 树下的海:为什么导入成功后必须在使用的时候manifest里面配置android:allowup = true
  • Rc在努力:如果是用RecyclerView的朋友可以在isScroll方法中加入判断RecyclerView滚动的判断
    if (view2 instanceof RecyclerView){
    RecyclerView recyclerView = (RecyclerView) view2;
    if (fistChildView.getTop() != 0) {
    return true;
    } else {
    if (recyclerView.getChildLayoutPosition(fistChildView)!=0) {
    return true;
    }
    }
    }
  • Rc在努力:最近看了一下项目源码,有个地方不是很明白`CalendarLayout`中`onFinishInflate`方法中,`mTopView.setCaledarTopViewChangeListener`这个方法的回调应该是当`ViewPager`转页的时候,为什么`CalendarLayout`要重新`requestLayout`?,感觉没必要,我注释了之后没发现什么异常
    Rc在努力:@Rc在努力 首先给作者一个赞:+1: ,回到问题,我知道为什么要requestLayout了,虽然ViewPager在滑动后本身会调用requestLayout,但是时机不对,导致下一页显示的时候才layout(效果不好~~)
    Rc在努力:在setItem方法中,调用addView方法,而addview的方法会回调onMeasure 和onLayout
  • 欧阳1314:在不, 遇到大事情了, 这个控件下方为什么有个空白, 我明明撑满了.
  • 离氺的鱼:如何禁止时间框滑动啊?
  • 欧阳1314:日历不错, 但是还是差一些东西,
    1, 一绘制控件能不能设置显示方式,以月,以周
    2,能不能直接跳转到某一天去
    3,以周显示的时候滑动是以月的方式切换
    4,自定义界面的时候能不能把CalendarBean字段多填充一些,最好可以继承
    Rc在努力:@Tatastar 日历里面是用ViewPager做的,每个月的具体显示是自定ViewGroup,对于第三点,我觉得如果用RecyclerView填充应该可以实现,在不同状态设置不同的layoutmanger,
    Terry:日历做的很不错,已经集成到项目里面去了,不过遇到一些问题
    1、能不能直接跳转到某一天去
    2、回到今天
    codbking:@唯Tae 工作太忙,没多少时间维护了
  • 6ed23ddd145a:mylibrary中的一些自定义类在用的时候需要写么??
  • 简书取名好难:果然是高仿
  • b12fcf9f17c1:打包成aar xml中添加 calendarDateView无法初始化,是怎么回事啊
    b12fcf9f17c1: java.lang.ArrayIndexOutOfBoundsException: length=150; index=150
    at com.codbking.calendar.ChinaDate.leapMonth(ChinaDate.java:114)
    at com.codbking.calendar.ChinaDate.calElement(ChinaDate.java:266)
    at com.codbking.calendar.ChinaDate.getChinaDate(ChinaDate.java:381)
    at com.codbking.calendar.CalendarFactory.geCalendarBean(CalendarFactory.java:76)
    at com.codbking.calendar.CalendarFactory.getMonthOfDayList(CalendarFactory.java:46)
    at com.codbking.calendar.CalendarDateView$1.instantiateItem(CalendarDateView.java:100)
    codbking:@it技术员前来报道 请问有错误日志吗?
    b12fcf9f17c1: @it技术员前来报道 我是照着你给的例子写上去的外面是calendarLayout
  • 逍遥xiao恶魔:楼主 请问日历下面的列表 放recyclerView的话 滑倒底部之后再往上划 再向下划的时候 每次日历都会被展开 这个问题怎么解决啊
    Rc在努力:@codbking 下个版本什么时候啊,亲~~
    逍遥xiao恶魔:@codbking 好吧 谢谢 :smirk:
    codbking:@逍遥xiao恶魔 这个我下个版本支持下,你先用listview吧
  • wbBin:请问可以实现 今天以前的日期不可点击 并变成灰色吗
    codbking:@纯净的稻米 今天以前的变成灰色还是很容易实现的,你不处理今天以前的点击事件就行,有个设置view的方法,有个设置点击事件的方法,你在这两个方法里面分别处理逻辑就可以了
  • NanBox:如果能实现,收起状态下左右滑动是切换星期,就更好了。
  • 319adedb59f8:收藏
    codbking:@SwordJian 谢谢支持
  • codbking:呵呵,谢谢支持啊,这个一言两语说不清,我有时间整理下代码,多加点注释进去,基本你要了解view的绘制原理,以及touch事件的传递原理
    d04e066aa2af:@土逗牛肉 CalendarLayout 这个类看一下就知道了
  • 晴天的下雨天:做的挺好的,可以设置特定天绘制文字嘛,向上滚动一行置顶怎么实现的,感觉很好,我大概看了下源码,还没看懂,可以讲一下嘛

本文标题:高仿钉钉和小米的日历控件

本文链接:https://www.haomeiwen.com/subject/ctejvttx.html