2017-02-05 4 views
1

ユーザーがイベントを追加できるイベントリストを作成しました。現在の日付と時刻に渡されないイベントのみを表示します。私は、ユーザーが日付と時刻を選択することを許可します。日付と時刻は、日付の場合はdd/MM/yy(00/00/0000)、別の文字列変数の場合はHH:mm(00:00)の形式で格納されます。ArrayListを日付/時刻に従ってフィルタリングし、Android Studioのrecyclerviewに表示するにはどうすればよいですか?

私はこれを約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)何であるかは、これは上記のコードは、前のイベントの細かいフィルターをうまくいくかどうかを単純なフィルタです。私はそれを渡す場合には、他の固定パラメータは2017年1月2日

+0

スタックトレース/エラー出力全体をポストできますか? –

+0

また、あなたのコードには「adapter.filter()」とは何ですか? –

+0

アダプタオブジェクトの参照がnullです。あなたはアダプタをどこで初期化しているか表示できますか? –

答えて

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

Dateクラスは日付がbefore()又はafter()指定された日付であるかどうかをテストするための方法を提供するe..g働きます。

また、日付と時刻の両方の情報を持つ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です。 adapterオブジェクトを初期化していることを確認してから、futureEvents()メソッドを呼び出してください。

どちらの側にもしきい値を設定する場合は、現在の日付オブジェクトを変更して、しきい値に基づいて設定された日時を指すようにすることができます。たとえば、あなたがこのような何かを行うことができ、次の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); 
} 

同様に、あなたは、日、月または時間を変更することができます。

+0

私はスタックと私のadapter.filterを追加しました。私は以前のすべてのイベントをフィルタリングするフィルタメソッドを定義したアダプタクラスを持っています。 –

+0

ありがとう、私はsetMinutesが減価償却されていることを確認します、それを使用するには問題ありませんか? –

+0

@AdamBrown私は日付をまとめておくことをお勧めします。ユーザー[Calender](https://developer.android.com/reference/java/util/Calendar.html)。あなたは日付を使用していたので、私はあなたを混乱させたくありませんでした。 –