Android中如何按当前日期过滤ArrayList<WeekViewEvent>?
当然可以实现按日期过滤WeekViewEvent的需求!折腾5小时确实头疼,我来给你捋清楚具体怎么做👇
核心思路
我们需要先确定目标日期的时间范围(比如当天00:00到23:59),然后从原始的ArrayList<WeekViewEvent>中筛选出时间落在这个范围内的事件,最后把过滤后的集合传给你的自定义ArrayAdapter即可。
1. 确定目标日期的时间范围
不管是当前日期还是用户切换后的日期,我们都需要先拿到该日期的起始和结束时间戳,用来和事件的时间做对比:
// 以当前日期为例,如果是切换后的日期,就用WeekView回调里的newDate Calendar targetDate = Calendar.getInstance(); // 获取目标日期的起始时间(00:00:00.000) Calendar startOfDay = (Calendar) targetDate.clone(); startOfDay.set(Calendar.HOUR_OF_DAY, 0); startOfDay.set(Calendar.MINUTE, 0); startOfDay.set(Calendar.SECOND, 0); startOfDay.set(Calendar.MILLISECOND, 0); long startTimestamp = startOfDay.getTimeInMillis(); // 获取目标日期的结束时间(23:59:59.999) Calendar endOfDay = (Calendar) targetDate.clone(); endOfDay.set(Calendar.HOUR_OF_DAY, 23); endOfDay.set(Calendar.MINUTE, 59); endOfDay.set(Calendar.SECOND, 59); endOfDay.set(Calendar.MILLISECOND, 999); long endTimestamp = endOfDay.getTimeInMillis();
2. 过滤WeekViewEvent集合
你可以用Java 8+的Stream API来简洁过滤,也可以用传统的循环方式,两种都给你列出来:
方式一:Stream API(简洁高效)
// 假设你的原始事件集合是originalEvents List<WeekViewEvent> filteredEvents = originalEvents.stream() .filter(event -> { long eventStart = event.getStartTime().getTimeInMillis(); long eventEnd = event.getEndTime().getTimeInMillis(); // 这里的判断逻辑:只要事件和目标日期有交集就保留(包括跨天事件) // 如果只想保留完全在当天内的事件,把条件改成 eventStart >= startTimestamp && eventEnd <= endTimestamp return (eventStart >= startTimestamp && eventStart <= endTimestamp) || (eventEnd >= startTimestamp && eventEnd <= endTimestamp) || (eventStart <= startTimestamp && eventEnd >= endTimestamp); }) .collect(Collectors.toList());
方式二:传统循环(兼容低版本Java)
List<WeekViewEvent> filteredEvents = new ArrayList<>(); for (WeekViewEvent event : originalEvents) { long eventStart = event.getStartTime().getTimeInMillis(); long eventEnd = event.getEndTime().getTimeInMillis(); // 同样的判断逻辑,根据你的需求调整 if ((eventStart >= startTimestamp && eventStart <= endTimestamp) || (eventEnd >= startTimestamp && eventEnd <= endTimestamp) || (eventStart <= startTimestamp && eventEnd >= endTimestamp)) { filteredEvents.add(event); } }
3. 更新自定义ArrayAdapter
把过滤后的集合传给适配器,并通知数据变化:
// 假设你的自定义适配器是customAdapter customAdapter.clear(); // 先清空原有数据 customAdapter.addAll(filteredEvents); // 添加过滤后的事件 customAdapter.notifyDataSetChanged(); // 通知适配器刷新UI
4. 处理日期切换场景(可选)
如果你的WeekView支持用户滑动切换日期,想要自动刷新对应日期的事件,可以监听WeekView的日期变化回调:
weekView.setOnDateChangeListener(new WeekView.OnDateChangeListener() { @Override public void onDateChange(Calendar newDate) { // 这里重复步骤1-3,用newDate作为目标日期重新过滤和更新适配器 Calendar startOfDay = (Calendar) newDate.clone(); startOfDay.set(Calendar.HOUR_OF_DAY, 0); startOfDay.set(Calendar.MINUTE, 0); startOfDay.set(Calendar.SECOND, 0); startOfDay.set(Calendar.MILLISECOND, 0); long startTimestamp = startOfDay.getTimeInMillis(); Calendar endOfDay = (Calendar) newDate.clone(); endOfDay.set(Calendar.HOUR_OF_DAY, 23); endOfDay.set(Calendar.MINUTE, 59); endOfDay.set(Calendar.SECOND, 59); endOfDay.set(Calendar.MILLISECOND, 999); long endTimestamp = endOfDay.getTimeInMillis(); List<WeekViewEvent> filteredEvents = originalEvents.stream() .filter(event -> { long eventStart = event.getStartTime().getTimeInMillis(); long eventEnd = event.getEndTime().getTimeInMillis(); return (eventStart >= startTimestamp && eventStart <= endTimestamp) || (eventEnd >= startTimestamp && eventEnd <= endTimestamp) || (eventStart <= startTimestamp && eventEnd >= endTimestamp); }) .collect(Collectors.toList()); customAdapter.clear(); customAdapter.addAll(filteredEvents); customAdapter.notifyDataSetChanged(); } });
注意事项
- 确保你的
WeekViewEvent对象的getStartTime()和getEndTime()返回的是正确的Calendar对象,否则时间对比会出错。 - 如果不需要显示跨天事件,直接修改过滤条件为
eventStart >= startTimestamp && eventEnd <= endTimestamp即可。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

