GithubHelp home page GithubHelp logo

magicmashroom / supercalendar Goto Github PK

View Code? Open in Web Editor NEW
2.8K 63.0 486.0 2.1 MB

@Deprecated android 自定义日历控件 支持左右无限滑动 周月切换 标记日期显示 自定义显示效果跳转到指定日期

Java 100.00%
calendar calendar-view android

supercalendar's Introduction

SuperCalendar

ChangeLog

  • 发布1.6 稳定版
  • 发布1.5 修改了一些BUG
  • 发布1.4稳定版
  • 清除了dev污染
  • 添加手动切换上一月下一月功能
  • 解决神奇的日历尺寸问题,确保日历尺寸正确

简介

  • 可能是第十好的Android开源日历
  • 博主现在工作在一家教育公司,最近公司的产品狗扔过来一个需求,说要做一个可以周月切换的课表,可以展示用户在某一天的上课安排。接到这个任务之后我研究了很多的日历控件,并且抽出了一个calenderlib。先看一下最后的项目中的效果:
  • 看到本篇文章的同学估计也是实验课或者项目需求中需要一个日历表,当我接到这个需求的时候,当时脑子压根连想都没想,这么通用的控件,GitHub上一搜一大堆不是嘛。可是等到真正做起来的时候,扎心了老铁,GitHub上的大神居然异常的不给力,都是实现了基本功能,能够滑动切换月份,找实现了周月切换功能的开源库很难。终于我费尽千辛万苦找到一个能够完美切换的项目时,你周月切换之后的数据乱的一塌糊涂啊!!!
  • 算了,自己撸一个!!!

项目链接 SuperCalendar

  • 如果你感觉到对你有帮助,欢迎star
  • 如果你感觉对代码有疑惑,或者需要修改的地方,欢迎issue

主要特性

  • 日历样式完全自定义,拓展性强
  • 左右滑动切换上下周月,上下滑动切换周月模式
  • 抽屉式周月切换效果
  • 标记指定日期(marker)
  • 跳转到指定日期

思路

使用方法

XML布局

  • 新建XML布局

RecyclerView的layout_behavior为com.ldf.calendar.behavior.RecyclerViewBehavior

 <android.support.design.widget.CoordinatorLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <com.ldf.calendar.view.MonthPager
            android:id="@+id/calendar_view"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="#fff">
        </com.ldf.calendar.view.MonthPager>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="com.ldf.calendar.behavior.RecyclerViewBehavior"
            android:background="#c2c2c2"
            android:layout_gravity="bottom"/>

    </android.support.design.widget.CoordinatorLayout>
    

自定义日历样式

  • 新建CustomDayView继承自DayView并重写refreshContent 和 copy 两个方法
	@Override
    public void refreshContent() {
        //你的代码 你可以在这里定义你的显示规则
        super.refreshContent();
    }

    @Override
    public IDayRenderer copy() {
        return new CustomDayView(context , layoutResource);
    }
  • 新建CustomDayView实例,并作为参数构建CalendarViewAdapter
	CustomDayView customDayView = new CustomDayView(context, R.layout.custom_day);
        calendarAdapter = new CalendarViewAdapter(
                context,
                onSelectDateListener,
                CalendarAttr.CalendarType.MONTH,
                CalendarAttr.WeekArrayType.Monday,
                customDayView);

初始化View

  • 目前来看 相比于Dialog选择日历 我的控件更适合于Activity/Fragment在Activity的onCreate 或者Fragment的onCreateView 你需要实现这两个方法来启动日历并装填进数据
@Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_syllabus);
        initCalendarView();
    }
    
    private void initCalendarView() {
        initListener();
        CustomDayView customDayView = new CustomDayView(context, R.layout.custom_day);
        calendarAdapter = new CalendarViewAdapter(
                context,
                onSelectDateListener,
                CalendarAttr.CalendarType.MONTH,
                CalendarAttr.WeekArrayType.Monday,
                customDayView);
        initMarkData();
        initMonthPager();
    } 

使用此方法回调日历点击事件

private void initListener() {
        onSelectDateListener = new OnSelectDateListener() {
            @Override
            public void onSelectDate(CalendarDate date) {
                //your code
            }

            @Override
            public void onSelectOtherMonth(int offset) {
                //偏移量 -1表示上一个月 , 1表示下一个月
                monthPager.selectOtherMonth(offset);
            }
        };
    }

使用此方法初始化日历标记数据

private void initMarkData() {
       HashMap markData = new HashMap<>();
        //1表示红点,0表示灰点
       markData.put("2017-8-9" , "1");
       markData.put("2017-7-9" , "0");
       markData.put("2017-6-9" , "1");
       markData.put("2017-6-10" , "0");
       calendarAdapter.setMarkData(markData);
   }

使用此方法给MonthPager添加上相关监听

monthPager.addOnPageChangeListener(new MonthPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                mCurrentPage = position;
                currentCalendars = calendarAdapter.getAllItems();
                if(currentCalendars.get(position % currentCalendars.size()) instanceof Calendar){
                    //you code
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

重写onWindowFocusChanged方法,使用此方法得知calendar和day的尺寸

	@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(hasFocus && !initiated) {
            CalendarDate today = new CalendarDate();
        	calendarAdapter.notifyDataChanged(today);
            initiated = true;
        }
    }
  • 大功告成,如果还不清晰,请下载DEMO

Download


Gradle: Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
    repositories {
	...
	maven { url 'https://www.jitpack.io' }
    }
}

Step 2. Add the dependency

	dependencies {
	        compile 'com.github.MagicMashRoom:SuperCalendar:1.6'
	}

Licence

  Copyright 2017 MagicMashRoom, Inc.

supercalendar's People

Contributors

fylder avatar keaideluren avatar magicmashroom avatar nickqiao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

supercalendar's Issues

fragmennt切换回来后返回今日报索引越界

在fragment里面使用日历,来回切换fragment,返回今日报错,
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at com.ldf.calendar.component.CalendarViewAdapter.notifyDataChanged(CalendarViewAdapter.java:232)

同是道中人

你好,楼主,你的公司是教育项目和我们公司一样,产品方向也一样,能给个联系方式么,有问题方便沟通

按钮切换时,月份显示不正确

点击"下一月"按钮,在点击“今天"或者”更改效果“,最上面的月份显示不正确。例如,今天是8.22,显示的是9.22,而且下面的天数仍是31天。

onWindowFocusChanged

How to use the calendar in a fragment that do not have the onWindowFocusChanged method?

v1.3.1 CustomDayView 为 null

你好,很高兴能将这个自定义控件分享出来,本人非常喜欢,但是在本人开发的过程中,总是报了一个 CustomDayView 方法为 null 的问题,如下所示:

Caused by: java.lang.NullPointerException
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:529)
at android.view.View.measure(View.java:15518)
at com.ldf.calendar.view.DayView.setupLayoutResource(DayView.java:44)
at com.ldf.calendar.view.DayView.(DayView.java:32)
at calendar.oa.com.myapplication.CustomDayView.(CustomDayView.java:36)
at calendar.oa.com.myapplication.MainActivity.initCalendarView(MainActivity.java:114)
at calendar.oa.com.myapplication.MainActivity.onCreate(MainActivity.java:61)

image

*开始我以为控件一直没有获取到,后来即使是改成这样:
image

也还是会报空,不知道问题出在哪,所以能帮忙看看具体问题出现在哪嘛?

DialogFragment中使用该控件问题

在DialogFragment中使用该控件,例如:滑动到2017-1月后,结束界面,再次进入,显示当前日期。左右滑动,就跳转到2016-12 或者 2017-2。

日历模式控制问题

楼主,我想不用recycler的上下滑动来关联日历的月,周模式。想用一个自己的view,但是现在我现在在自定义的日历控件和recycler控件中间加上一个自己的view时,
image
但是最后显示的时候这个位置不对啊,是这样的

c86c6bacb3f026f04cf54eb543c2960e

我想把这个textview放到日历控件和recycler控件之间,然后通过添加的这个textview来控制日历的显示模式,楼主请帮忙看看呢!给条明路

切换周月bug和RecyclerView显示不全bug及功能扩展

1.当RecyclerView滑动到底时再切换周月时,滑动切换周月不正常,RecyclerView显示不全
2.当RecyclerView内容不足一屏时滑动切换为周模式不正常(选中周跳到上面,下面空白,放弃切换时显示不正常)
3.如何像小米日历那样滑动日历部分也可以切换周月(当前只有滑动RecyclerView才可以切换)

关于 周 功能

是否可考虑新增以下 2 个功能:
1、切换到周滚动时,提供显示当前周是当年的第几周
2、根据选择哪年哪周,再跳转滚动到该周的周日历
谢谢~

适配

在1920*1080适配上有问题

bug

1.点击切换周月视图 list有留白,效果图:

2

2.切换周月后,点击list某一子item,再次随便连续选择某一日期,日历有多选,控件日期重复显示,效果图:

1

7.0测试
@MagicMashRoom

  • [ ]

日历样式问题

是否将星期中的第一天作为周日,最后一天作为周六

崩溃

Process: com.hqyxjy.ldf.supercalendar, PID: 6218
                                                                        java.lang.ClassCastException: com.ldf.calendar.translator.ExpandableLayout cannot be cast to com.ldf.calendar.view.MonthPager
                                                                            at com.ldf.calendar.behavior.RecyclerViewBehavior.getMonthPager(RecyclerViewBehavior.java:123)

NullPointerException

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.ldf.calendar.component.CalendarViewAdapter.getPagers()' on a null object reference
at com.ldf.calendar.view.MonthPager.getTopMovableDistance(MonthPager.java:125)
at com.ldf.calendar.behavior.MonthPagerBehavior.onDependentViewChanged(MonthPagerBehavior.java:73)
at com.ldf.calendar.behavior.MonthPagerBehavior.onDependentViewChanged(MonthPagerBehavior.java:16)
at android.support.design.widget.CoordinatorLayout.onChildViewsChanged(CoordinatorLayout.java:1336)
at android.support.design.widget.CoordinatorLayout$OnPreDrawListener.onPreDraw(CoordinatorLayout.java:1907)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2412)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1303)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6688)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:822)
at android.view.Choreographer.doCallbacks(Choreographer.java:625)
at android.view.Choreographer.doFrame(Choreographer.java:594)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:808)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5714)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:984)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我按着demo写的 但是我只抽取了<android.support.design.widget.CoordinatorLayout></>日历 代码也完全复制过来了 望解答

版本

上次修改内容之后是不是忘记提升版本了?

fix(1、周月切换问题;2、recyclerview反弹)

1、例如点击上个月某一天后,切换回当前月,月切换周,再周切换月,切换回上个月执行月切换周,显示有问题;
2、下拉时,日历下的recyclerview内容下拉会出现反弹,部分内容嵌入日历。导致想上拉日历得重新下拉全部内容后,才可以上拉日历。可否在日历内根据上下拉手势实现日历的周月切换。

月周切换问题

我看简书上日历下面有切换月周的图片,我怎么加不上。求怎么加

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.