{"id":13396346,"url":"https://github.com/roomorama/Caldroid","last_synced_at":"2025-03-13T23:30:53.525Z","repository":{"id":48830617,"uuid":"8641067","full_name":"roomorama/Caldroid","owner":"roomorama","description":"A better calendar for Android","archived":false,"fork":false,"pushed_at":"2021-07-09T14:15:24.000Z","size":4180,"stargazers_count":1418,"open_issues_count":132,"forks_count":532,"subscribers_count":95,"default_branch":"master","last_synced_at":"2024-07-31T18:17:09.032Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roomorama.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-03-08T02:06:03.000Z","updated_at":"2024-07-09T17:28:29.000Z","dependencies_parsed_at":"2022-09-23T22:31:08.953Z","dependency_job_id":null,"html_url":"https://github.com/roomorama/Caldroid","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roomorama%2FCaldroid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roomorama%2FCaldroid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roomorama%2FCaldroid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roomorama%2FCaldroid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roomorama","download_url":"https://codeload.github.com/roomorama/Caldroid/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243499858,"owners_count":20300704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T18:00:46.485Z","updated_at":"2025-03-13T23:30:53.164Z","avatar_url":"https://github.com/roomorama.png","language":"Java","funding_links":[],"categories":["Index `(light-weight pages)`","日历时间","Index","Java","Libs"],"sub_categories":["\u003cA NAME=\"Widget\"\u003e\u003c/A\u003eWidget"],"readme":"Caldroid\n========\n\nCaldroid is a fragment that display calendar with dates in a month. Caldroid can be used as embedded fragment, or as dialog fragment. User can also swipe left/right to navigate to different months.\n\nIt's very easy to customize look and feel of Caldroid using your own theme, thanks to [@crocodile2u](https://github.com/crocodile2u) contribution. There are two default themes in Caldroid (Light and Dark). You can provide your own theme based on these default themes as well.\n\nCaldroid is fully localized. You can customize start day of the week for different countries. By default calendar start on Sunday.\n\nCaldroid can be used with Android 2.2 and above. It is extracted from [official Roomorama application](https://play.google.com/store/apps/details?id=com.roomorama)\n\n\u003cimg src=\"https://raw.github.com/roomorama/Caldroid/master/screenshot/1.png\" width=\"270\" style=\"margin-right:10px;\"\u003e\n\u003cimg src=\"https://raw.github.com/roomorama/Caldroid/master/screenshot/dark.png\" width=\"270\"\u003e\n\nIf you found bugs specific to Caldroid, please open a new issue on Github. However for general Android questions (about layout, drawable, etc), you probably can find more information on StackOverflow.\n\nSetup\n=====\n\n**For Android Studio user**: add `compile 'com.roomorama:caldroid:3.0.1'` to your gradle build file.\n\n**For Maven user**:\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.roomorama\u003c/groupId\u003e\n    \u003cartifactId\u003ecaldroid\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**For Eclipse/ADT user**: please see tag [eclipse_project](https://github.com/roomorama/Caldroid/releases/tag/eclipse_project), download the source codes, check out the CaldroidSample to see how the library works. However you are strongly recommended to use Maven or gradle, because this tag is no longer supported.\n\nTo use in your project, reference the child library project as a library. If you see JAR mismatched error, replace your android-support-v4.jar to the jar inside Caldroid. Make sure you compile the project against Android 4.2 and above to allow nested fragment. See more at http://developer.android.com/about/versions/android-4.2.html#NestedFragments\n\nFeatures\n========\n\n##Flexible setup: can be embedded or shown as dialog\nIf you support Android 2.2 and above, you can embed caldroid fragment in your activity with below code:\n\n``` java\nCaldroidFragment caldroidFragment = new CaldroidFragment();\nBundle args = new Bundle();\nCalendar cal = Calendar.getInstance();\nargs.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);\nargs.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));\ncaldroidFragment.setArguments(args);\n\nFragmentTransaction t = getSupportFragmentManager().beginTransaction();\nt.replace(R.id.calendar1, caldroidFragment);\nt.commit();\n```\n\nIf your app only target minSdkVersion 16 and above, you can use Caldroid too. First, you need to change your `Activity` class to `FragmentActivity`, and add support library to your project. You don't have to change how you use `android.app.Fragment`.\n\n```java\nCaldroidFragment caldroidFragment = new CaldroidFragment();\nBundle args = new Bundle();\nCalendar cal = Calendar.getInstance();\nargs.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);\nargs.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));\ncaldroidFragment.setArguments(args);\n\nandroid.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction();\nt.replace(R.id.cal, caldroidFragment);\nt.commit();\n```\n\nYou can also embed caldroid fragment as a child in your fragment.\n\nCaldroid accepts numerous arguments during start up:\n\n``` java\npublic final static String\n            DIALOG_TITLE = \"dialogTitle\",\n            MONTH = \"month\",\n            YEAR = \"year\",\n            SHOW_NAVIGATION_ARROWS = \"showNavigationArrows\",\n            DISABLE_DATES = \"disableDates\",\n            SELECTED_DATES = \"selectedDates\",\n            MIN_DATE = \"minDate\",\n            MAX_DATE = \"maxDate\",\n            ENABLE_SWIPE = \"enableSwipe\",\n            START_DAY_OF_WEEK = \"startDayOfWeek\",\n            SIX_WEEKS_IN_CALENDAR = \"sixWeeksInCalendar\",\n            ENABLE_CLICK_ON_DISABLED_DATES = \"enableClickOnDisabledDates\",\n            SQUARE_TEXT_VIEW_CELL = \"squareTextViewCell\",\n            THEME_RESOURCE = \"themeResource\";\n```\n\nTo customize the startDayOfWeek, just use\n\n``` java\nBundle args = new Bundle();\nargs.putInt(CaldroidFragment.START_DAY_OF_WEEK, CaldroidFragment.TUESDAY); // Tuesday\ncaldroidFragment.setArguments(args);\n```\n\nIf you want to know when user clicks on disabled dates:\n\n```java\nBundle args = new Bundle();\nargs.putBoolean(CaldroidFragment.ENABLE_CLICK_ON_DISABLED_DATES, true);\ncaldroidFragment.setArguments(args);\n```\n\nBy default, Caldroid use square TextView to display date. However when the screen has limited space, user can switch to normal TextView instead:\n\n```java\nBundle args = new Bundle();\nargs.putBoolean(CaldroidFragment.SQUARE_TEXT_VIEW_CELL, false);\ncaldroidFragment.setArguments(args);\n```\n\nCaldroid uses `SQUARE_TEXT_VIEW_CELL` parameter internally as well. When the phone is in portrait mode, it will default `SQUARE_TEXT_VIEW_CELL` to `true`, and on landscape, `SQUARE_TEXT_VIEW_CELL` is set to `false`. If your app provides different value, Caldroid will use your value instead of the default one.\n\nTo show the caldroid fragment as a dialog, you might want to set the dialog title. There is a convenient method for that:\n\n``` java\nCaldroidFragment dialogCaldroidFragment = CaldroidFragment.newInstance(\"Select a date\", 3, 2013);\ndialogCaldroidFragment.show(getSupportFragmentManager(),\"TAG\");\n```\n\n## Custom theme\n\nYou can define your own theme to change the look and feel of Caldroid without having to subclass it. You should inherit from base theme `CaldroidDefault`. Here's how to create a dark theme:\n\n```xml\n    \u003c!-- Dark theme. --\u003e\n    \u003cstyle name=\"CaldroidDefaultDark\" parent=\"CaldroidDefault\"\u003e\n        \u003citem name=\"styleCaldroidViewLayout\"\u003e@style/CaldroidDefaultDarkCalendarViewLayout\u003c/item\u003e\n        \u003citem name=\"styleCaldroidMonthName\"\u003e@style/CaldroidDefaultDarkMonthName\u003c/item\u003e\n        \u003citem name=\"styleCaldroidNormalCell\"\u003e@style/CaldroidDefaultDarkNormalCell\u003c/item\u003e\n        \u003citem name=\"styleCaldroidSquareCell\"\u003e@style/CaldroidDefaultDarkSquareCell\u003c/item\u003e\n        \u003citem name=\"styleCaldroidGridView\"\u003e@style/CaldroidDefaultDarkGridView\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkCalendarViewLayout\"\u003e\n        \u003citem name=\"android:background\"\u003e@android:color/black\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkMonthName\" parent=\"CaldroidDefaultMonthName\"\u003e\n        \u003citem name=\"android:textColor\"\u003e@color/caldroid_white\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkGridView\" parent=\"CaldroidDefaultGridView\"\u003e\n        \u003citem name=\"android:background\"\u003e@color/caldroid_middle_gray\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkCell\" parent=\"CaldroidDefaultCell\"\u003e\n        \u003citem name=\"android:textColor\"\u003e@color/cell_text_color_dark\u003c/item\u003e\n        \u003citem name=\"android:background\"\u003e@drawable/cell_bg_dark\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkNormalCell\" parent=\"CaldroidDefaultDarkCell\"\u003e\n        \u003citem name=\"android:padding\"\u003e5dp\u003c/item\u003e\n    \u003c/style\u003e\n\n    \u003cstyle name=\"CaldroidDefaultDarkSquareCell\" parent=\"CaldroidDefaultDarkCell\" /\u003e\n```\n\nAfter creating your own theme, supply it to your Caldroid fragment:\n\n```java\nBundle args = new Bundle();\nargs.putInt(CaldroidFragment.THEME_RESOURCE, com.caldroid.R.style.CaldroidDefaultDark);\ncaldroidFragment.setArguments(args);\n```\n\n## Custom backgrounds and text colors for different dates\n\nIt is very easy to supply different backgrounds and text colors for different dates:\n\n``` java\n// You can use any of below methods to set background colors\npublic void setBackgroundDrawableForDates(HashMap\u003cDate, Drawable\u003e backgroundForDateMap);\npublic void setBackgroundDrawableForDateTimes(HashMap\u003cDateTime, Drawable\u003e backgroundForDateTimeMap);\npublic void setBackgroundDrawableForDate(Drawable drawable, Date date);\npublic void setBackgroundDrawableForDateTime(Drawable drawable, DateTime dateTime);\n\n// Below methods is to set text color\npublic void setTextColorForDates(HashMap\u003cDate, Integer\u003e textColorForDateMap);\npublic void setTextColorForDateTimes(HashMap\u003cDateTime, Integer\u003e textColorForDateTimeMap);\npublic void setTextColorForDate(int textColorRes, Date date);\npublic void setTextColorForDateTime(int textColorRes, DateTime dateTime);\n```\n\nTo use these methods, you can define your colors in ```color.xml``` and background in ```drawable``` folder:\n\n``` java\nColorDrawable blue = new ColorDrawable(getResources().getColor(R.color.blue));\nColorDrawable green = new ColorDrawable(Color.GREEN);\ncaldroidFragment.setBackgroundDrawableForDate(blue, blueDate);\ncaldroidFragment.setBackgroundDrawableForDate(green, greenDate);\n\ncaldroidFragment.setTextColorForDate(R.color.white, blueDate);\ncaldroidFragment.setTextColorForDate(R.color.white, greenDate);\n```\n\nYou need to call ```refreshView()``` after above methods to update calendar appearance.\n\nYou can also clear the background and text color:\n```java\npublic void clearBackgroundDrawableForDate(Date date);\npublic void clearBackgroundDrawableForDates(List\u003cDate\u003e dates);\npublic void clearTextColorForDates(List\u003cDate\u003e dates);\npublic void clearTextColorForDate(Date date);\n```\n\n## Display user events on Caldroid\n\nCaldroid is simply an UI library and it does *not* connect to user calendar database or fetch any user's events. If your app wants to display these events on Caldroid:\n\n- Your app needs to fetch events (from server or from user calendar database, depend on your app)\n\n- Design a drawable for the date with event. See more here for all types of drawable you can create: http://developer.android.com/guide/topics/resources/drawable-resource.html\n\n- Use above `setBackgroundDrawableForDate` method to set the event drawable to correct date\n\n- Call `refreshView()` to update calendar appearance\n\nIf you need to customize more for the cell, you can [supply your own cell design](https://github.com/roomorama/Caldroid#client-can-customize-look-and-feel-of-almost-all-views).\n\n## Set min / max date\n\nClient can use below methods:\n\n``` java\npublic void setMinDate(Date minDate);\npublic void setMinDateFromString(String minDateString, String dateFormat);\n\npublic void setMaxDate(Date minDate);\npublic void setMaxDateFromString(String maxDateString, String dateFormat);\n```\n\nTo refresh the calendar, just call ```refreshView()```\n\n## Set disabled dates\n\nClient can either provide ArrayList\u003cDate\u003e or ArrayList\u003cString\u003e to Caldroid.\n``` java\npublic void setDisableDates(ArrayList\u003cDate\u003e disableDateList);\npublic void setDisableDatesFromString(ArrayList\u003cString\u003e disableDateStrings);\npublic void setDisableDatesFromString(ArrayList\u003cString\u003e disableDateStrings, String dateFormat);\n```\n\nTo clear the disabled dates:\n``` java\npublic void clearDisableDates();\n```\n\n##Select dates within a range\nTo select dates within a range:\n\n``` java\npublic void setSelectedDates(Date fromDate, Date toDate);\npublic void setSelectedDateStrings(String fromDateString, String toDateString, String dateFormat);\n```\n\nTo clear the selected dates:\n``` java\npublic void clearSelectedDates();\n```\n\n\n##Show / Hide the navigation arrows to move to previous or next month\nTo show/hide the navigation arrows:\n\n``` java\npublic void setShowNavigationArrows(boolean showNavigationArrows);\n```\n\nTo enable / disable swipe:\n\n``` java\npublic void setEnableSwipe(boolean enableSwipe);\n```\n\nClient can programmatically move the calendar (with animation) to a specified date:\n\n``` java\npublic void moveToDate(Date date);\npublic void moveToDateTime(DateTime dateTime);\n```\n\n##Allow user to select a date and inform listener\n\nCaldroid inform clients via CaldroidListener.\n\n``` java\nfinal CaldroidListener listener = new CaldroidListener() {\n\n\t@Override\n\tpublic void onSelectDate(Date date, View view) {\n\t\tToast.makeText(getApplicationContext(), formatter.format(date),\n\t\t\t\tToast.LENGTH_SHORT).show();\n\t}\n\n\t@Override\n\tpublic void onChangeMonth(int month, int year) {\n\t\tString text = \"month: \" + month + \" year: \" + year;\n\t\tToast.makeText(getApplicationContext(), text,\n\t\t\t\tToast.LENGTH_SHORT).show();\n\t}\n\n\t@Override\n\tpublic void onLongClickDate(Date date, View view) {\n\t\tToast.makeText(getApplicationContext(),\n\t\t\t\t\"Long click \" + formatter.format(date),\n\t\t\t\tToast.LENGTH_SHORT).show();\n\t}\n\n\t@Override\n\tpublic void onCaldroidViewCreated() {\n\t\tToast.makeText(getApplicationContext(),\n\t\t\t\t\"Caldroid view is created\",\n\t\t\t\tToast.LENGTH_SHORT).show();\n\t}\n\n};\n\ncaldroidFragment.setCaldroidListener(listener);\n\n```\n\nUser can also customize the navigation arrows and month title textView: font, size, onClickListener, onLongClickListener, etc. Client can supply different adapter to the weekdayGridView. Make sure you only access these methods after Caldroid has been successfully attached to view, otherwise you will see NullPointerException.\n\n```java\nfinal CaldroidListener listener = new CaldroidListener() {\n\n    @Override\n    public void onSelectDate(Date date, View view) {\n        // Do something\n    }\n\n    @Override\n    public void onCaldroidViewCreated() {\n        // Supply your own adapter to weekdayGridView (SUN, MON, etc)\n        caldroidFragment.getWeekdayGridView().setAdapter(YOUR_ADAPTER);\n\n        Button leftButton = caldroidFragment.getLeftArrowButton();\n        Button rightButton = caldroidFragment.getRightArrowButton();\n        TextView textView = caldroidFragment.getMonthTitleTextView();\n\n        // Do customization here\n    }\n\n};\n\ncaldroidFragment.setCaldroidListener(listener);\n```\n\n##Handle screen rotation\n\nTo handle rotation properly, Caldroid provides method to get current states of the fragment:\n\n``` java\npublic Bundle getSavedStates();\npublic void saveStatesToKey(Bundle outState, String key);\npublic void restoreStatesFromKey(Bundle savedInstanceState, String key);\npublic void restoreDialogStatesFromKey(FragmentManager manager, Bundle savedInstanceState, String key, String dialogTag)\n```\n\nUsing above method, you can save current state of Caldroid on ```onSaveInstanceState(Bundle outState)``` method.\n\nOn your activity code:\n\n``` java\n@Override\nprotected void onSaveInstanceState(Bundle outState) {\n\t// TODO Auto-generated method stub\n\tsuper.onSaveInstanceState(outState);\n\n\tif (caldroidFragment != null) {\n\t\tcaldroidFragment.saveStatesToKey(outState, \"CALDROID_SAVED_STATE\");\n\t}\n\n\tif (dialogCaldroidFragment != null) {\n\t\tdialogCaldroidFragment.saveStatesToKey(outState,\n\t\t\t\t\"DIALOG_CALDROID_SAVED_STATE\");\n\t}\n}\n```\n\nThen you can restore the state in ```onCreate(Bundle savedInstanceState)``` of your activity. The algorithm is like below:\n\n``` java\n// If Activity is created after rotation\nif (savedInstanceState != null) {\n  caldroidFragment.restoreStatesFromKey(savedInstanceState,\n\t\t\t\t\t\"CALDROID_SAVED_STATE\");\n}\n\n// If activity is created from fresh\nelse {\n  Bundle args = new Bundle();\n\tCalendar cal = Calendar.getInstance();\n  args.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);\n  args.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));\n  args.putBoolean(CaldroidFragment.ENABLE_SWIPE, true);\n  args.putBoolean(CaldroidFragment.SIX_WEEKS_IN_CALENDAR, false);\n  caldroidFragment.setArguments(args);\n}\n\n```\n\nIf you use Caldroid as dialog, you can use ```restoreDialogStatesFromKey```\n\n``` java\nfinal String dialogTag = \"CALDROID_DIALOG_FRAGMENT\";\nif (savedInstanceState != null) {\n  dialogCaldroidFragment.restoreDialogStatesFromKey(getSupportFragmentManager(),\n      \t\t\t\t\tsavedInstanceState, \"DIALOG_CALDROID_SAVED_STATE\",\n      \t\t\t\t\tdialogTag);\n\tBundle args = dialogCaldroidFragment.getArguments();\n\targs.putString(\"dialogTitle\", \"Select a date\");\n} else {\n\t// Setup arguments\n\tBundle bundle = new Bundle();\n\t// Setup dialogTitle\n\tbundle.putString(CaldroidFragment.DIALOG_TITLE, \"Select a date\");\n\tdialogCaldroidFragment.setArguments(bundle);\n}\n```\n\nRefer to the CaldroidSampleActivity for more detail.\n\n##Allow customized cell for the dates gridView\n\nCaldroid provides flexible API to supply your own cell view. What you have to do is:\n\n1) Create your own cell view layout in your project\n\n2) Subclass CaldroidGridAdapter and override ```getView(int position, View convertView, ViewGroup parent)```. See CaldroidSampleCustomAdapter.java for more detail. Here you can customize everything: layout, text color, background for different states (normal, disable, selected)\n\n3) Subclass CaldroidFragment to use your custom adapter instead of the default CaldroidGridAdapter. This is simplest step:\n\n``` java\npublic class CaldroidSampleCustomFragment extends CaldroidFragment {\n\n\t@Override\n\tpublic CaldroidGridAdapter getNewDatesGridAdapter(int month, int year) {\n\t\t// TODO Auto-generated method stub\n\t\treturn new CaldroidSampleCustomAdapter(getActivity(), month, year, getCaldroidData(), extraData);\n\t}\n\n}\n```\n\n4) Use your new customized fragment in your project instead of the default CaldroidFragment.\n\nTo see how it works, you can uncomment this line in CaldroidSampleActivity\n\n``` java\n// final CaldroidSampleCustomFragment caldroidFragment = new CaldroidSampleCustomFragment();\n```\n\nThe ```extraData``` is a ```HashMap\u003cString, Object\u003e```, is designed to let client injects custom data to CaldroidGridAdapter, so that data can be used to customize the date grid view. Usage is simple:\n\nIn your client code:\n\n``` java\n// To set the extraData:\nHashMap\u003cString, Object\u003e extraData = caldroidFragment.getExtraData();\nextraData.put(\"YOUR_CUSTOM_DATA_KEY1\", yourCustomData1);\nextraData.put(\"YOUR_CUSTOM_DATA_KEY2\", yourCustomData2);\n\n// Refresh view\ncaldroidFragment.refreshView();\n\n```\n\nIn the CaldroidSampleCustomAdapter:\n\n``` java\n@Override\npublic View getView(int position, View convertView, ViewGroup parent) {\n  // Get your data here\n  ArrayList yourCustomData1 = (ArrayList) extraData.get(\"YOUR_CUSTOM_DATA_KEY1\");\n  String yourCustomData2 = (String) extraData.get(\"YOUR_CUSTOM_DATA_KEY2\");\n\n  // Continue to build your customized view\n}\n```\n\n\nBasic Structure\n===============\n\nCaldroid fragment includes 4 main parts:\n\n1) Month title view: show the month and year (e.g MARCH, 2013)\n\n2) Navigation arrows: to navigate to next month or previous month\n\n3) Weekday gridview: contains only 1 row and 7 columns. To display\n  \"SUN, MON, TUE, WED, THU, FRI, SAT\"\n\n4) An infinite view pager that allow user to swipe left/right to change month. This library is taken from https://github.com/antonyt/InfiniteViewPager\n\nThis infinite view pager recycles 4 fragment, each fragment contains a gridview with 7 columns to display the dates in month. Whenever user swipes different screen, the date grid views are updated.\n\n\nOthers\n======\n\nCaldroid code is simple and clean partly because of powerful [date4j](http://www.date4j.net/) library!\n\n\nLicense\n=======\nSee LICENSE.md\n\n\nApp uses Caldroid\n=================\n[SilentMe](https://play.google.com/store/apps/details?id=com.mindlens.alarmmanagerdemo\u0026hl=en)\n\n[Work Mate](http://play.google.com/store/apps/details?id=com.michaelmcneildev.workmate)\n\n[Attendance Register (students)](https://play.google.com/store/apps/details?id=com.rudra.attendanceRegister)\n\n[eDiary](https://play.google.com/store/apps/details?id=it.dreamerspillow.ediary)\n\n[Moon Calendar](https://play.google.com/store/apps/details?id=fr.calendrierlunaire.android)\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/roomorama/caldroid/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froomorama%2FCaldroid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froomorama%2FCaldroid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froomorama%2FCaldroid/lists"}