You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:17:58