如何根据日期/时间过滤ArrayList,并将其显示在Android Studio的回收视图中



我创建了一个事件列表,允许用户添加事件,我想做的是只显示未超过当前日期和时间的事件。我允许用户选择日期和时间,这些日期和时间存储为字符串,格式为dd/MM/yy(00/00/0000)表示日期,HH:MM(00:00)表示时间,分别存储在单独的字符串变量中。

我已经做了将近3天了,仍然不知道该怎么做,这个概念就在我的脑海中,但似乎不想离开。在尝试了几件事之后,我最终得到了这样的东西:

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 android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
    at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714)
    at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
    at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1375)
    at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:784)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
    at android.view.View.measure(View.java:19861)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6343)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:621)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
02-05 11:33:47.282 19010-19010/com.example.myapp E/UncaughtException:     at android.app.ActivityThread.main(ActivityThread.java:6126)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

更新——什么是adapter.filter(FutureEvents)这是一个简单的过滤器,如果上面的代码有效,它应该可以很好地过滤掉以前的事件。它的工作,如果我通过它其他固定参数e..g 01/02/2017

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

Date类提供了一种方法来测试日期是指定日期的before()还是after()

此外,您还可以获得一个包含日期和时间信息的Date对象,然后将其与当前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); 
}

编辑:以上内容仍然适用于您的代码。但是查看堆栈跟踪,您得到的是adapter上的NullPointerException引用。您的adapter对象引用为null。在调用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); 
}

类似地,您可以修改小时、天、月

最新更新