在开发中可能会遇到某些情况下需要用到日历的

2019-09-30 15:31栏目:美高梅开户送58元官网
TAG:

在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带的日历由于各个系统版本不同导致日历的样式也不同,这样就会导致使用起来比较麻烦..而且在日历中加标签也不好实现...所以很多时候日历都是自己去实现的...由于自定义日历会比较麻烦...这里就教大家使用GridView来实现,主要是我们比较熟悉这个控件...到时候也可以根据自己的情况进行封装为自定义View

美高梅网上游戏,在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带的日历由于各个系统版本不同导致日历的样式也不同,这样就会导致使用起来比较麻烦..而且在日历中加标签也不好实现...所以很多时候日历都是自己去实现的...由于自定义日历会比较麻烦...这里就教大家使用GridView来实现,主要是我们比较熟悉这个控件...到时候也可以根据自己的情况进行封装为自定义View

最近项目需要日历效果,考虑用第三方的反而不太适合设计需求,修改复杂,与其这样不入自己重新写一个干净的控件。虽不是什么牛逼控件,但是也需要我们能按照设计自己写出来。在此记录一下实现思路。

美高梅开户送58元官网,下面就先看看效果图.由于是从项目中抽取出来的,某些地方定制性比较强, 可以根据需求自行修改

下面就先看看效果图.由于是从项目中抽取出来的,某些地方定制性比较强, 可以根据需求自行修改

效果图:

美高梅开户送58元官网 1效果图

效果图

美高梅开户送58元官网 2切换周美高梅开户送58元官网 3切换月份

图中的红点就是标签,蓝色背景就是选中的意思.下面开始撸代码:先上核心的GridView的适配器:CalendarAdapter.java

美高梅开户送58元官网 4

  • 头部是一个自定义组合控件;
  • 显示一周的日期部分用GridView 更加方便更新;
  • 切换月的部分是一个自定义PopupWindow;
  • GridView选中效果;
  • GridView根据手势GestureDetector监听左右滑动;
  • 核心其实还是Calendar类,根据这个类我们可以获取制定日期一周的日期集合、可以获取制定日期一月的日期集合等等;
  • 根据阳历日期获取阴历日期
/** * 日历gridview中的每一个item显示的textview */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; /** * 当前选中天的字符串 例:20170830 */ 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; /** * 距离当前月的差(上一个月-1,当前月0,下一个月+1) */ 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.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;// 当月字体设黑 }else { myViewHolder.mIdTvItemSelectTimeDay.setTag;// 当月字体设黑 } if (currentFlag != -1 && currentFlag == position) { //设置当天的背景 myViewHolder.mIdTvItemSelectTimeDay.setBackgroundResource(R.color.mainMenu); myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.WHITE); } else { myViewHolder.mIdTvItemSelectTimeDay.setBackgroundColor; } //显示小圆点 if (schDateTagFlag != null && schDateTagFlag.size { if (schDateTagFlag.contains) { 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); } /** * 得到某年的某月的天数且这月的第一天是星期几 * * @param year * @param month */ private void getCalendar(int year, int month) { isLeapyear = sc.isLeapYear; //是否为闰年 daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的总天数 dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天为星期几 lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); //上一个月的总天数 getWeek(year, month); } /** * 将一个月中的每一天的值添加入数组dayNuber中 * * @param year * @param 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] =  + ""; } else if (i < daysOfMonth + dayOfWeek) {//本月 int day = i - dayOfWeek + 1; //得到的日期 dayNumber[i] = i - dayOfWeek + 1 + ""; //对于当前月才去标记当前日期 String yearStr = String.valueOf; String monthStr =getStr(String.valueOf; String dayStr =getStr(String.valueOf; String timeAll = yearStr + monthStr + dayStr; if (timeAll.equals(currentDayStr)) {//判断选中的位置 currentFlag = i; } if (mSet != null && mSet.size { for (String s : mSet) {//迭代器遍历判断是否需要带标签 if (timeAll.equals { schDateTagFlag.add; } } } setShowYear; setShowMonth(String.valueOf; } else { //下一个月 dayNumber[i] = j + ""; j++; } } } /** * 获取当前时间 样式:20170830 * @param position * @return */ public String getItemTime(int position) { String month = getStr(getShowMonth; String day = getStr(getDateByClickItem, 2); return getShowYear() + month + day; } /** * 保留N位整数,不足前面补0 * * @param file String * @param bit 位数 * @return */ public static String getStr(String file,int bit) { while (file.length() < bit) file = "0" + file; return file; } /** * 点击每一个item时返回item中的日期 * * @param position * @return */ public String getDateByClickItem(int position) { return dayNumber[position]; } /** * 在点击gridView时,得到这个月中第一天的位置 * * @return */ public int getStartPositon() { return dayOfWeek + 7; } /** * 在点击gridView时,得到这个月中最后一天的位置 * * @return */ 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); } }}

图中的红点就是标签,蓝色背景就是选中的意思.

日历工具类:

下面开始撸代码:

// xml布局引用<com.wzh.calendar.view.DataView android: android:layout_width="match_parent" android:background="@color/color_ffffff" android:layout_height="wrap_content"></com.wzh.calendar.view.DataView>// 代码中,自定义回调监听选中的日期dataView =  findViewById(R.id.week);dataView.setOnSelectListener(new DataView.OnSelectListener() { @Override public void onSelected(DateEntity date) { info.setText("日期:"+ date.date+"n"+ "周几:"+ date.weekName+"n"+ "今日:"+ date.isToday+"n"+ "时间戳:"+ date.million+"n"); Log.e("wenzhiao--------------",date.toString;//需要传递此种格式的日期,不传默认是获取今日的日期dataView.getData("2017-04-19");
/** * 日历工具类 */public class SpecialCalendar { private int daysOfMonth = 0; //某月的天数 private int dayOfWeek = 0; //具体某一天是星期几 /** * 判断是否为闰年 * @param year * @return */ public boolean isLeapYear { if (year % 100 == 0 && year % 400 == 0) { return true; } else if (year % 100 != 0 && year % 4 == 0) { return true; } return false; } /** * 得到某月有多少天数 * @param isLeapyear * @param month * @return */ public int getDaysOfMonth(boolean isLeapyear, int month) { switch  { case 1: case 3: case 5: case 7: case 8: case 10: case 12: daysOfMonth = 31; break; case 4: case 6: case 9: case 11: daysOfMonth = 30; break; case 2: if (isLeapyear) { daysOfMonth = 29; } else { daysOfMonth = 28; } } return daysOfMonth; } /** * 指定某年中的某月的第一天是星期几 * @param year * @param month * @return */ public int getWeekdayOfMonth(int year, int month){ Calendar cal = Calendar.getInstance(); cal.set(year, month-1, 1); dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1; return dayOfWeek; } } 

先上核心的GridView的适配器:

回调的日期信息封装成一个实体类DateEntity:

版权声明:本文由美高梅开户送58元官网发布于美高梅开户送58元官网,转载请注明出处:在开发中可能会遇到某些情况下需要用到日历的