2017-08-15 7 views
-2

ISo私のアプリにグループチャットがあります。私は "部屋"とボタンが "部屋"に参加するとき、ユーザーがすべての古いメッセージを画面上に表示するが、私は新しいものを表示したいと思うが、私は表示するfirebaseリストアダプタを使用しています...空リストと新しいメッセージだけを表示する方法を知っています。Androidグループのチャットだけが表示されます。古いメッセージのないリストビューユーザーがグループに参加すると新しいメッセージが表示されます

 btnJoin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DatabaseReference db = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID); 
      db.child(user.getUid()).setValue(""); 


     } 
    }); 

    btnSend.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DatabaseReference db = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID).child("Messages").push(); 
      db.setValue(new ChatMessage(ePlain.getText().toString(),user.getDisplayName())); 
      ePlain.setText(""); 
      ePlain.requestFocus(); 

     } 
    }); 
    private void displayChat() { 
    btnSend.setVisibility(View.VISIBLE); 
    eventChat.setVisibility(View.VISIBLE); 
    FirebaseListAdapter<ChatMessage> adapter = new FirebaseListAdapter<ChatMessage>(EventDetails.this,ChatMessage.class,R.layout.one_chat_list,FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID).child("Messages")) { 
     @Override 
     protected void populateView(View v, ChatMessage model, int position) { 
      TextView messageTextm,messageUser,messageTime; 
      messageTextm = (TextView) v.findViewById(R.id.chatMessage); 
      messageUser = (TextView)v.findViewById(R.id.chatUserName); 
      messageTime = (TextView)v.findViewById(R.id.message_time); 

      messageTextm.setText(model.getMessageText()); 
      messageUser.setText(model.getMessageUser()); 
      messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm)", model.getMessageTime())); 

     } 
    }; 
    eventChat.setAdapter(adapter); 

} 
    DatabaseReference check = FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID); 
      check.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if(dataSnapshot.hasChild(user.getUid())){ 
         displayChat(); 
        } 
       } 

そこで彼が参加する前にユーザーがクリックは、すべての古いメッセージとメッセージが表示されたボタンのリストビューに参加したときに...とここで私は新しい午前任意のコードをアップロードしていないため申し訳ありませんが、あなたは私のコード の何か他のものが必要な場合を教えてこれは私のデータベース構造ですhttps://ibb.co/d47D9v

+0

ようこそを得ると思います。ご質問の際には、あなたのコードを掲載し、該当する場合は何を試みたかを尋ねます。これはあなたに最高の助けを得るでしょう。この記事が参考になる場合があります:https://stackoverflow.com/help/how-to-ask – JCooke

答えて

1

あなたはfirebaseの時間を追跡する必要があります。まず、メッセージがいつ投稿されたかを追跡する必要があります。次に、ユーザーがルームに参加するタイミングを把握する必要があります。あなたがメッセージを照会する場合次に、あなたは

sortBy('time').startAt(timeUserJoined)

EDITボタンに あなたは

FirebaseDatabase.getInstance().getReference("EventsUsers") 
    .child(uniqEventID).child(user.getUid()).setValue(""); 

はちょうど空のノードを追加するのではなく、現在の時間に値を設定しているのonClickに参加することができますフラグとして。

メッセージを追加するときに、追加した時間も追加する必要があります。だからあなたは既に

db.setValue(new ChatMessage(ePlain.getText().toString(), 
    user.getDisplayName()), System.currentTimeMillis()); 

最後に、あなたのアダプタでは、あなたの参照をもっと

FirebaseDatabase.getInstance().getReference("EventsUsers") 
    .child(uniqEventID).child("Messages") 
    .orderBy("time").beginAt(timeUserJoined) 

あるべきtimeUserJoinedが

上からキーなど、ユーザーのID値であるが作ったクラスにこれを追加
FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID) 
    .setSingleValueListener(result-> timeUserJoing = result.value) 

これは完璧なコードではありませんが、私はあなたがスタックオーバーフローにポイントに

+0

質問が更新され、コードが追加されました –

関連する問題