有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据日期/时间过滤ArrayList,并在Android Studio的recyclerview中显示它?

我已经创建了一个事件列表,允许用户添加事件,我想做的是只显示没有经过当前日期和时间的事件。我允许用户选择存储为字符串的日期和时间,格式为dd/MM/yy(00/00/0000),日期为HH:MM(00:00),时间为HH:MM(00:00)

我已经为此工作了将近三天,但仍然不知道该怎么做,这个概念就在我脑海中,但似乎不想离开。在尝试了几件事之后,我最终得到了如下结果:

public void futureEvents() {
    ArrayList<Events> futureEvents = new ArrayList<>();
    long currentTime = new Date().getTime();
    Log.d("CurrentTime", String.valueOf(currentTime)); // This works fine, when I Log.d I get results like 1486243693904

    for(Events events : eventsList) {

        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date date = null;
        try { // I am forced to surround date = formatter.... code in try and catch
            date = formatter.parse(events.getEventDate());
        } catch (ParseException e) {

        }

        String eventTime = events.getEventTime();
        String []tokens = eventTime.split(":");
        long longEventTime = (long) ((Long.parseLong(tokens[0]) * 3.6e+6) + (Long.parseLong(tokens[1])* 1.66667e-5));
        long eventTimeAndDateInLong = Long.parseLong(String.valueOf(longEventTime + date.getTime()));

        if(currentTime < eventTimeAndDateInLong + 30*600000) {

            futureEvents.add(events); // throws a null object reference error
        }
    }

    adapter.filter(futureEvents); 
}

我不确定它是否有意义,但它肯定不起作用,尽管我不想放弃,但我厌倦了它在几次尝试后都不起作用,我对java还相当陌生,现在还不知道该怎么做。如果有人能帮忙,我将不胜感激

注意。我只想过滤掉已经过去的事件,并根据日期和时间显示即将到来的事件

更新---堆栈跟踪

02-05 11:33:47.282 19010-19010/com.example.myapp E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.myapp.SQLiteDB.EventsList_SQLDB.adapter.filter(java.util.ArrayList)' on a null object reference
                                                                          at layout.Events.upcomingEvents(Events.java:352)
                                                                          at layout.Events.onCreateView(Events.java:100)
                                                                          at 安卓.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
                                                                          at 安卓.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
                                                                          at 安卓.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
                                                                          at 安卓.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
                                                                          at 安卓.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
                                                                          at 安卓.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969)
                                                                          at 安卓.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
                                                                          at 安卓.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                                                                          at 安卓.support.v4.view.ViewPager.populate(ViewPager.java:1268)
                                                                          at 安卓.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                          at 安卓.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714)
                                                                          at 安卓.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                                                                          at 安卓.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1375)
                                                                          at 安卓.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:784)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                          at 安卓.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                          at 安卓.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                          at 安卓.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                          at 安卓.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                          at 安卓.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                          at 安卓.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                          at com.安卓.internal.policy.DecorView.onMeasure(DecorView.java:689)
                                                                          at 安卓.view.View.measure(View.java:19861)
                                                                          at 安卓.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
                                                                          at 安卓.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
                                                                          at 安卓.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
                                                                          at 安卓.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                                                                          at 安卓.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6343)
                                                                          at 安卓.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                                                                          at 安卓.view.Choreographer.doCallbacks(Choreographer.java:686)
                                                                          at 安卓.view.Choreographer.doFrame(Choreographer.java:621)
                                                                          at 安卓.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
                                                                          at 安卓.os.Handler.handleCallback(Handler.java:751)
                                                                          at 安卓.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at 安卓.os.Looper.loop(Looper.java:154)
02-05 11:33:47.282 19010-19010/com.example.myapp E/UncaughtException:     at 安卓.app.ActivityThread.main(ActivityThread.java:6126)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                          at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:776)

更新——什么是适配器。过滤器(未来事件) 这是一个简单的过滤器,如果上面的代码工作正常,它应该可以很好地过滤掉以前的事件。如果我传递其他固定参数,它就会工作。。g 2017年2月1日

public void setFilter(ArrayList<Events> filterEvents) {
        eventsLists = new ArrayList<>();
        eventsLists.addAll(filterevents);
        notifyDataSetChanged();
    }

共 (1) 个答案

  1. # 1 楼答案

    ^{}类提供了一种方法来测试日期是^{}还是^{}指定的日期

    此外,您还可以获取同时包含日期和时间信息的Date对象,然后将其与当前日期对象进行比较

    使用所有这些,您可以大大简化代码,如下所示:

    public void futureEvents() {
        ArrayList<Events> futureEvents = new ArrayList<>();
        Date currentDate = new Date();
    
        for(Events events : eventsList) {    
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            Date date = null;
            try { 
                date = formatter.parse(events.getEventDate() + " " + events.getEventTime());
            } catch (ParseException e) {
    
            }
    
            if(currentDate.before(date)) {    
                futureEvents.add(events); 
            }
        }
    
        adapter.filter(futureEvents); 
    }
    

    编辑:以上内容仍然适用于您的代码。但是看看你的堆栈跟踪,你会得到一个关于adapterNullPointerException引用。你的adapter对象引用为空。 在调用futureEvents()方法之前,请确保初始化了adapter对象

    如果要在任意一侧设置阈值,可以修改当前日期对象,使其指向基于阈值设置的日期和时间。例如,如果你想过滤接下来30分钟内发生的事件,你可以这样做:

    public void futureEvents() {
        ArrayList<Events> futureEvents = new ArrayList<>();
        Date currentDate = new Date();
    
        for(Events events : eventsList) {    
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            Date date = null;
            try { 
                date = formatter.parse(events.getEventDate() + " " + events.getEventTime());
            } catch (ParseException e) {
    
            }
    
            Date thresholdDate = currentDate.clone(); //makes a copy of the currentDate object
            thresholdDate.setMinutes(thresholdDate .getMinutes() + 30);//Modify minutes to 30 minutes in future.
    
            if(currentDate.before(date) && date.before(thresholdDate)) {    
                futureEvents.add(events); 
            }
        }
    
        adapter.filter(futureEvents); 
    }
    

    同样,您可以修改小时、天、月