2017-09-10 14 views
0

私は最近、自分のアプリにチャット機能を追加しました。 メッセージとそのタイムスタンプをFirebase databaseに保存しています。チャットでメッセージを適切に処理する方法

私は、(現在のチャットルームで)最後の60のメッセージだけを表示する方法を理解しようとしています。これは、limitToLast()を使用してFirebaseから現在の会話の最後の60項目だけを取得することを意味します。

さらにメッセージアーカイブを処理する適切な方法があります私は60件のメッセージ制限をスワイプによって到達されたときにのみ表示されますLoad moreボタンを追加したいと思いますし、それは別の60

をロードする必要があります上記のように?

以下のコードを使用して、実際に特定のメッセージアーカイブ全体を取得します。特定のチャットアーカイブに何千ものメッセージがある場合、これは効果がないことがわかります。これを実現するために

mChildEventListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class); 
       mMessageAdapter.add(chatMessage); 


      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 
     mDatabaseReference.child("chat_messages").child(chatId).addChildEventListener(mChildEventListener); 

答えて

1

、私はあなたが次のロジックを使用してrecomand:

pageEndOffset = 0; 
pageLimit = 60; 

pageEndOffset += pageLimit; 

Query query = mDatabaseReference.child("chat_messages") 
    .orderByChild("chatId").limitToFirst(pageLimit) 
    .startAt(pageEndOffset); 
query.addValueEventListener(YourActivity.this); 

はそれがお役に立てば幸いです。

+0

startAt()はドキュメントのとおりです: '選択された注文方法に応じて、指定したキーまたは値以上のアイテムを返します.'したがって、私はこれをインデックスとして使用できません。 'limitToFirst'でインデックスの制限を指定することしかできません。これは、ある範囲のインデックスを取得しようとするときにはあまり役に立ちません。間違っていると私を訂正してください –

+0

あなたが話しているインデックスについて私は理解していませんが、初めて会話の60のメッセージを読み込むためにデータベースに問い合わせることができます。 –

+0

'chatId'は' int'ではないので、私はそれに基づいて問い合わせることができません。さらに、 'limitToFirst'と' startAt'を使って、あなたが何を示唆しているかを正しく理解すれば、**最も古い**から**最新の**にメッセージを取得します。私は**最新の**から**最も古い**に取得しようとしています** –

関連する問題