我在我的应用程序中进行了群组聊天。我有“房间”和按钮加入“房间”,当用户点击加入按钮所有旧消息出现在屏幕上但我想只显示新的,我使用firebase列表适配器显示...一切正常但只是不要我不知道如何显示空列表和新消息,ty。
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 :(得分:1)
你必须跟踪firebase中的时间。首先,您需要跟踪消息的发布时间,其次,您需要跟踪用户何时加入房间。然后,当您查询消息时,您可以
sortBy('time').startAt(timeUserJoined)
修改强> 在你的按钮加入onClick你有
FirebaseDatabase.getInstance().getReference("EventsUsers")
.child(uniqEventID).child(user.getUid()).setValue("");
将值设置为当前时间,而不是仅将空节点添加为标志。
然后,当您添加消息时,您还需要添加添加消息的时间。所以只需将它添加到您已经创建的课程
db.setValue(new ChatMessage(ePlain.getText().toString(),
user.getDisplayName()), System.currentTimeMillis());
最后,在您的适配器中,您的引用应该更像
FirebaseDatabase.getInstance().getReference("EventsUsers")
.child(uniqEventID).child("Messages")
.orderBy("time").beginAt(timeUserJoined)
timeUserJoined是用户从上面作为密钥的值
FirebaseDatabase.getInstance().getReference("EventsUsers").child(uniqEventID)
.setSingleValueListener( result-> timeUserJoing = result.value)
这不是完美的代码,但我认为你明白了