MagicMashRoom / SuperCalendar

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

动态设置setMarkData(),界面问题 #164

Open forEveryDay opened 6 years ago

forEveryDay commented 6 years ago

例如: image 即,动态翻页的时候动态添加,滑动的页面对不上,可能停在某一个页面上面

forEveryDay commented 6 years ago

简单来说setMarkData只能在初始化的时候使用,后续设置会造成界面切换问题

forEveryDay commented 6 years ago

我觉得很多业务场景都是翻页的时候动态去标记的,而不是初始化的时候一次标记完,是我用的不对吗?

MrLingGuiQin commented 6 years ago

同上我也遇到了类似的问题,第二次 setMarkData 之后 调用 CalendarAdapter.notifyDataSetChanged() 界面日期并不会更新重新绘制,只有当点击日期之后 点 界面才会更新。

itkun2013 commented 6 years ago

我也遇到这问题,就是翻页到下月或者上月,调用 private void initMarkData() { HashMap<String, CalendarRecordDomain> markData = new HashMap<>(); for (int i = 0; i < recordDomains.size(); i++) { //以时间为key值 markData.put(recordDomains.get(i).getDate(), recordDomains.get(i)); } calendarAdapter.setMarkData(markData); // calendarAdapter.notifyDataChanged(); } 日期从6月直接调到8月 晕死,数据我也找不到了 ,混乱了

itkun2013 commented 6 years ago

我已经解决了这个问题,不要在 monthPager.addOnPageChangeListener的onPageSelected()中调用setMark数据,可以在首次的时候显示mark数据,当添加了数据,发送广播setMark(),这样就不至于月份混乱了

forEveryDay commented 6 years ago

楼上还有这种操作

SoloAlien commented 6 years ago

@itkun2013 朋友,我使用了广播也没能解决这个问题,你能详细说说你是如何解决的吗? @forEveryDay 楼主的这个问题解决了吗?

itkun2013 commented 6 years ago

`` /**

itkun2013 commented 6 years ago

这是本人的效果图 qq 20180713111647 qq 20180713111714

SoloAlien commented 6 years ago

@itkun2013 很高兴看到你的解决方案,我看了代码之后,也找到了解决方法,就是请求到数据后setmarker,然后不要调用calendarAdapter.notifyDataChanged()方法,而是调用calendarAdapter.invalidateCurrentCalendar()方法,这样就可以实现无错乱更新日历的效果了,关注最后两行代码:

private void HttpRecord() { map = new HashMap<>(); holidayMap = new HashMap<>(); HttpUtil.http(Constants.QUERY_ATTENDANCE_DETAIL + "?newMonth=" + time + "&userGid=" + userGid, null, new HttpCallBack(this) { @Override protected void onSuccess(AttendancePersonBean attendancePersonBean) { if (null!=attendancePersonBean){ if (null!=attendancePersonBean.getIsflag()&&attendancePersonBean.getIsflag().equals("2")) return; } leaveInfos.addAll(attendancePersonBean.getLeaveInfo()); String[] s = attendancePersonBean.getMonthInfo().split(","); for (int i = 1; i < CalenderUtils.getMothDays(time); i++) { map.put(CalenderUtils.Time2String(CalenderUtils.String2Time(time + "-" + i, CalenderUtils.DATE), "yyyy-M-d"), s[i - 1]); } if (ArrayUtils.isNotEmpty(leaveInfos)) {//如果有请假信息,把请假那几天的数值改为5 for (int j = 0; j < leaveInfos.size(); j++) { AttendancePersonBean.LeaveInfo leaveInfo = leaveInfos.get(j); if (null != leaveInfo && StrUtils.isNotEmpty(leaveInfo.getApp_leave_start_time()) && StrUtils.isNotEmpty(leaveInfo.getApp_leave_start_time())) { int days = CalenderUtils.getDays(leaveInfo.getApp_leave_start_time(), leaveInfo.getApp_leave_end_time()); if (days > 0) { for (int m = 0; m <= days; m++) { map.put(CalenderUtils.Time2String(CalenderUtils.addDay(leaveInfo.getApp_leave_start_time(), m), "yyyy-M-d"), "5"); holidayMap.put(CalenderUtils.Time2String(CalenderUtils.addDay(leaveInfo.getApp_leave_start_time(), m), "yyyy-M-d"), leaveInfo); } } } } } CalendarDate today = new CalendarDate(); showDesc(today.toString()); calendarAdapter.setMarkData(map); calendarAdapter.invalidateCurrentCalendar(); } }); }

jackielia commented 6 years ago

@WJ-Alien 你好,我这边是滑动日历时请求服务器一个月数据下来设置日历标记,第一次setMarkData是有效的,在滑动日历至其他月时第二次设置setMarkData和invalidateCurrentCalendar还是有错乱更新日历的效果。方便问下你那边除了invalidateCurrentCalendar,改了哪里的源码使得功能正常不?

lisen87 commented 6 years ago

@jackielia 直接使用这两行代码 Utils.setMarkData(markData); calendarAdapter.invalidateCurrentCalendar(); 不要用calendarAdapter.setMarkData(map);

KaiLe6311 commented 5 years ago

楼上答案有效,在CalendarViewAdapter类,修改setMarkData方法, 原:Utils.setMarkData(markData); notifyDataChanged();

改为:Utils.setMarkData(markData); invalidateCurrentCalendar();

yujinlongqqqq commented 4 years ago

@jackielia 直接使用这两行代码 Utils.setMarkData(markData); calendarAdapter.invalidateCurrentCalendar(); 不要用calendarAdapter.setMarkData(map);

也解决了我的问题,感谢