在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带的日历由于各个系统版本不同导致日历的样式也不同,这样就会导致使用起来比较麻烦..而且在日历中加标签也不好实现...所以很多时候日历都是自己去实现的...由于自定义日历会比较麻烦...这里就教大家使用GridView来实现,主要是我们比较熟悉这个控件...到时候也可以根据自己的情况进行封装为自定义View
下面就先看看效果图.由于是从项目中抽取出来的,某些地方定制性比较强, 可以根据需求自行修改
效果图
图中的红点就是标签,蓝色背景就是选中的意思.
下面开始撸代码:
先上核心的GridView的适配器:
CalendarAdapter.java
public class CalendarAdapter extends BaseAdapter { private static String TAG = "CalendarAdapter"; private boolean isLeapyear = false; //是否为闰年 private int daysOfMonth = 0; //某月的天数 private int dayOfWeek = 0; //具体某一天是星期几 private int lastDaysOfMonth = 0; //上一个月的总天数 private Context context; private String[] dayNumber = new String[42]; //一个gridview中的日期存入此数组中 private SpecialCalendar sc = null; private int currentYear = 0; private int currentMonth = 0; private int currentFlag = -1; private String currentDayStr; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); private Set<Integer> schDateTagFlag = new ArraySet<>(); //存储当月所有的日程日期(标签) private String showYear = ""; //用于在头部显示的年份 private String showMonth = ""; //用于在头部显示的月份 private String animalsYear = ""; private String leapMonth = ""; //闰哪一个月 private Set<String> mSet = null; private int jumpMonth = 0; public CalendarAdapter(Context context, int year, int month, String currentDayStr) { this.context = context; sc = new SpecialCalendar(); currentYear = year; currentMonth = month; //得到跳转到的月份 this.currentDayStr = currentDayStr; getCalendar(currentYear, currentMonth); } @Override public int getCount() { return dayNumber.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder myViewHolder = null; if (convertView == null || convertView.getTag() == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item_select_time, null); myViewHolder = new ViewHolder(convertView); convertView.setTag(myViewHolder); } else { myViewHolder = (ViewHolder) convertView.getTag(); } myViewHolder.mIdTvItemSelectTimeDay.setText(dayNumber[position]); myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.GRAY);//不是当前月为灰 if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) { // 当前月信息显示 myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.BLACK);// 当月字体设黑 myViewHolder.mIdTvItemSelectTimeDay.setTag(true);// 当月字体设黑 }else { myViewHolder.mIdTvItemSelectTimeDay.setTag(false);// 当月字体设黑 } if (currentFlag != -1 && currentFlag == position) { //设置当天的背景 myViewHolder.mIdTvItemSelectTimeDay.setBackgroundResource(R.color.mainMenu); myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.WHITE); } else { myViewHolder.mIdTvItemSelectTimeDay.setBackgroundColor(0); } //显示小圆点 if (schDateTagFlag != null && schDateTagFlag.size() > 0) { if (schDateTagFlag.contains(position)) { if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.VISIBLE) { myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.VISIBLE); } } else { if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.GONE) { myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.GONE); } } } else { if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.GONE) { myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.GONE); } } return convertView; } public void addMonth() { jumpMonth++; } public void lessMonth() { jumpMonth--; } public void upDataMonth() { int stepYear; int stepMonth = currentMonth + jumpMonth; if (stepMonth > 0) { //下一个月 if (stepMonth % 12 == 0) { stepYear = currentYear + stepMonth / 12 - 1; stepMonth = 12; } else { stepYear = currentYear + stepMonth / 12; stepMonth = stepMonth % 12; } } else { //上一个月 stepYear = currentYear - 1 + stepMonth / 12; stepMonth = stepMonth % 12 + 12; } getCalendar(stepYear, stepMonth); } private void getCalendar(int year, int month) { isLeapyear = sc.isLeapYear(year); //是否为闰年 daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的总天数 dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天为星期几 lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); //上一个月的总天数 getWeek(year, month); } private void getWeek(int year, int month) { schDateTagFlag.clear(); currentFlag = -1; int j = 1; //得到当前月的所有日程日期(这些日期需要标记) for (int i = 0; i < dayNumber.length; i++) { if (i < dayOfWeek) { //前一个月 int temp = lastDaysOfMonth - dayOfWeek + 1; dayNumber[i] = (temp + i) + ""; } else if (i < daysOfMonth + dayOfWeek) {//本月 int day = i - dayOfWeek + 1; //得到的日期 dayNumber[i] = i - dayOfWeek + 1 + ""; //对于当前月才去标记当前日期 String yearStr = String.valueOf(year); String monthStr =getStr(String.valueOf(month),2); String dayStr =getStr(String.valueOf(day),2); String timeAll = yearStr + monthStr + dayStr; if (timeAll.equals(currentDayStr)) {//判断选中的位置 currentFlag = i; } if (mSet != null && mSet.size() > 0) { for (String s : mSet) {//迭代器遍历判断是否需要带标签 if (timeAll.equals(s)) { schDateTagFlag.add(i); } } } setShowYear(yearStr); setShowMonth(String.valueOf(month)); } else { //下一个月 dayNumber[i] = j + ""; j++; } } } public String getItemTime(int position) { String month = getStr(getShowMonth(), 2); String day = getStr(getDateByClickItem(position), 2); return getShowYear() + month + day; } public static String getStr(String file,int bit) { while (file.length() < bit) file = "0" + file; return file; } public String getDateByClickItem(int position) { return dayNumber[position]; } public int getStartPositon() { return dayOfWeek + 7; } public int getEndPosition() { return (dayOfWeek + daysOfMonth + 7) - 1; } public String getShowYear() { return showYear; } public void setShowYear(String showYear) { this.showYear = showYear; } public String getShowMonth() { return showMonth; } public void setShowMonth(String showMonth) { this.showMonth = showMonth; } public String getAnimalsYear() { return animalsYear; } public void setAnimalsYear(String animalsYear) { this.animalsYear = animalsYear; } public String getLeapMonth() { return leapMonth; } public void setLeapMonth(String leapMonth) { this.leapMonth = leapMonth; } public Set<String> getSet() { return mSet; } public void setSet(Set<String> set) { mSet = set; } static class ViewHolder { @BindView(R.id.id_img_item_select_time_logo) ImageView mIdImgItemSelectTimeLogo; @BindView(R.id.id_tv_item_select_time_day) TextView mIdTvItemSelectTimeDay; ViewHolder(View view) { ButterKnife.bind(this, view); } }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机Android使用GridView实现日历的方法
后端开发2023-05-30
Android使用GridView实现日历的简单功能
后端开发2022-06-06
Android使用GridView实现日历功能示例(详细代码)
后端开发2022-06-06
vue.js实现日历插件使用方法详解
后端开发2024-04-02
Android实现GridView中ImageView动态变换的方法
后端开发2022-06-06
Android:控件GridView的使用实例
后端开发2022-06-06
Android GridView实现滚动到指定位置的方法
后端开发2022-06-06
vue版日历组件的实现方法
后端开发2024-04-02
Android开发之使用GridView展示图片的方法
后端开发2022-06-06
Android实现九宫格(GridView中各项平分空间)的方法
后端开发2022-06-06
Android下拉刷新以及GridView使用方法详解
后端开发2022-06-06
GridView分页的实现方法是什么
后端开发2023-09-21
gridview控件使用的方法有哪些
后端开发2023-09-11
gridview控件的使用方法是什么
后端开发2023-08-16
Java使用Calendar类实现动态日历
后端开发2024-04-02
使用Vue实现简单日历效果
后端开发2024-04-02
Android中控件GridView实现设置行列分割线的方法示例
后端开发2022-06-06
Android中在GridView网格视图上实现item拖拽交换的方法
后端开发2022-06-06
Android编程实现GridView控件点击图片变暗效果的方法
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧