2017-12-16 15 views
0

リサイクラービューで私のイベントをタイムスタンプで取得したいと思います。 私のFirebaseにはいくつかのイベントがあり、長いタイムスタンプ(年+ "+月+" "+日)があり、最も古いイベントがリストの上にありますが、方法Query lastEventQuery = mEventsDatabase.child(list_event_id).orderByChild("Timestamp")は何も注文しません。質問はFirebaseの子供を注文していません

Firebase Structure: FIREBASE --> Events --> exampleOne ---> Timestamp: 19000101 


             --> exampleTwo ---> Timestamp: 20500131 
             --> exampleThree ---> Timestamp: 20301101 
             --> exampleFour ---> Timestamp: 20501210 

注文するリサイクルビューのフラグメント。

 @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 


      mMainView2 = inflater.inflate(R.layout.fragment_requests, container, false); 
      mEventsDatabase = FirebaseDatabase.getInstance().getReference().child("Events"); 
      mEventsDatabase.keepSynced(true); 


      mLayoutManager = new LinearLayoutManager(getContext()); 
      create_event_btn = (Button) mMainView2.findViewById(R.id.create_btn); 
      mEventList = (RecyclerView) mMainV 

iew2.findViewById(R.id.event_list); 
     mEventList.setHasFixedSize(true); 
     mEventList.setLayoutManager(mLayoutManager); 


     create_event_btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getActivity(), Create_EventActivity.class); 
       startActivity(intent); 
      } 
     }); 


     // Inflate the layout for this fragment 

     return mMainView2; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 


     FirebaseRecyclerAdapter<Events, EventsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Events, EventsViewHolder>(

       Events.class, 
       R.layout.event_single_layout, 
       EventsViewHolder.class, 
       mEventsDatabase 

     ) { 
      @Override 
      protected void populateViewHolder(final EventsViewHolder eventsViewHolder, final Events events, int i) { 


       final String list_event_id = getRef(i).getKey(); 
       Query lastEventQuery = mEventsDatabase.child(list_event_id).orderByChild("Timestamp"); 

       lastEventQuery.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         if (!dataSnapshot.exists()) { 
          return; 
         } 

         ... 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 

      } 
     }; 


     mEventList.setAdapter(firebaseRecyclerAdapter); 

    } 

    public static class EventsViewHolder extends RecyclerView.ViewHolder { 

     View mView2; 

     public EventsViewHolder(View itemView2) { 
      super(itemView2); 

      mView2 = itemView2; 

     } 

     public void setEventName(String name) { 

      TextView eventName = (TextView) mView2.findViewById(R.id.event_name); 
      eventName.setText(name); 
     } 

     public void setEventZeit(String time) { 

      TextView eventTime = (TextView) mView2.findViewById(R.id.event_time); 
      eventTime.setText(time); 
     } 

     public void setEventLocation(String location) { 

      TextView eventTime = (TextView) mView2.findViewById(R.id.event_location); 
      eventTime.setText(location); 


     } 

     public void setEventPreis(String price) { 
      TextView eventPrice = (TextView) mView2.findViewById(R.id.event_price); 
      eventPrice.setText(price); 



     } 


    } 

私はこの問題のために重要ではない部分を切り捨てるので、{}が間違っているかもしれません。この問題を解決するには

+0

'Events'の子を反復しているかどうか知っていますか?私には、あなたが実際に子供たちを突き抜けていないように見えますが、あなたはちょうど1人の子供を見ています。 –

+0

データベースルールでインデックスを追加しましたか? –

+0

何が正しく動作していないのですか?あなたがリスナーの中に存在していない場合、あなたは言った。 –

答えて

0

は、このコード行を変更してください:このコードの2行の

Query lastEventQuery = mEventsDatabase.child(list_event_id).orderByChild("Timestamp"); 

:あなたのコードで

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
Query lastEventQuery = rootRef.child("Events").orderByChild("Timestamp"); 

を、あなたの参照が間違っていました。 orderByChild()メソッドを使用する場合は、ノードが単一のイベントノードではないEventsノードの親の場所を参照する必要があります。

+0

これを行うと、DataSnapchot cantはイベントの値を取得します。たとえば、次のようになります。final String eventName = dataSnapshot.child( "Name")。getValue()。toString();これは今私にNullPointerExeption @AlexMamoを与えます – Georq

+0

これはあなたが間違った 'DatabaseReference'を指していることを意味します。データベースのスクリーンショットを追加してください。 –

+0

http://www.bilder-upload.eu/show.php?file=41f349-1513515556.png – Georq

0

このください:

DatabaseReference mEventsDatabase=FirebaseDatabase.getInstance().getReference().child("Events") 

      mEventsDatabase.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for(DataSnapshot data: dataSnapshot.getChildren()){ 
         String name=data.child("Name").getValue().toString(); 
         String price=data.child("price").getValue().toString(); 
         } 
        } 

は、親ノードの例Eventsへの参照を入れて、あなたがデータを取得することができaddvalueventlistenerを使用します。あなたのデータは子供の下にある(つまり、Eventsの下にある)ので、forループを使用してそれらの子の中を反復し、すべての値を得る。

+0

残念ながら、新しいイベントをアップロードするたびにアプリケーションがクラッシュし、RecyclerViewがそれを実現します。ソートは機能しません。 3つのイベントがある場合、1つのイベントだけが表示されますが、同じイベントは3回表示されます。すべて同じ値です。 – Georq

+0

これをソートするには、 'child(" Events ")'の後にorderbyChild( "Timestamp" –

関連する問題