2017-08-15 1 views
-2

ISo ich habe Gruppen-Chat in meiner App. Ich habe "Räume" und Knopf beitreten "Raum", wenn Benutzer klick Join-Taste alle alten Nachrichten auf dem Bildschirm erscheint, aber ich möchte nur neue anzeigen, ich verwende Firebase-Liste Adapter zum Anzeigen ... alles funktioniert gut, aber nur don Ich weiß nicht, wie man eine leere Liste und nur neue Nachrichten anzeigt, ty.Android-Gruppe Chat-Anzeige nur leere Listview ohne alte Nachrichten nur neue Nachrichten, wenn Benutzer beitreten Gruppe

 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(); 
        } 
       } 

Also, wenn Benutzer klickt beitreten Schaltfläche Listenansicht mit Nachrichten angezeigt alle alten Nachrichten, bevor er kam ... und sorry für keinen Code hochzuladen Ich bin neu hier, mir sagen, wenn Sie etwas anderes von meinem Code benötigen Das ist meine Datenbankstruktur https://ibb.co/d47D9v

+0

Willkommen bei Stack-Überlauf kommen. Wenn Sie eine Frage stellen, bitten wir Sie, Ihren Code zu veröffentlichen und was Sie gegebenenfalls versucht haben. Dadurch erhalten Sie die beste Hilfe. Sie können diesen Artikel hilfreich finden: https: //stackoverflow.com/help/how-to-ask – JCooke

Antwort

1

Sie müssen die Zeit in Firebase verfolgen. Zuerst müssen Sie verfolgen, wenn die Nachrichten veröffentlicht werden, zweitens müssen Sie verfolgen, wenn ein Benutzer dem Raum beitritt. Dann, wenn Sie die Nachrichten abfragen können Sie

sortBy('time').startAt(timeUserJoined)

EDIT auf Ihrer Taste beitreten onClick Sie haben

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

den Wert auf die aktuelle Zeit gesetzt, anstatt nur einen leeren Knoten Hinzufügen als eine Fahne.

Dann, wenn Sie eine Nachricht hinzufügen, müssen Sie die Uhrzeit hinzufügen, die es hinzugefügt wurde. So fügen Sie einfach diese auf die Klasse, die Sie bereits

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

schließlich in Ihrem Adapter, Ihre Referenz mehr sein sollte wie

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

timeUserJoined der Wert ist die ID des Benutzers als Schlüssel von oben

FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID) 
    .setSingleValueListener(result-> timeUserJoing = result.value) 

dies ist nicht perfekt Code, aber ich denke, dass Sie den Punkt

+0

Ich aktualisierte meine Frage, fügen Sie Code hinzu –

Verwandte Themen