【问题标题】:Android group chat display only empty listview without old messages just new messages when user join groupAndroid群聊仅在用户加入群组时显示空列表视图而没有旧消息仅显示新消息
【发布时间】:2017-08-15 14:47:48
【问题描述】:

所以我在我的应用程序中进行了群聊。我有“房间”和按钮加入“房间”,当用户单击加入按钮时,所有旧消息都会出现在屏幕上,但我只想显示新消息,我正在使用 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

【问题讨论】:

  • 欢迎来到 Stack Overflow。在提出问题时,我们会要求您发布您的代码以及您在适用的情况下尝试过的内容。这将为您提供最好的帮助。您可能会发现这篇文章对您有所帮助:stackoverflow.com/help/how-to-ask

标签: android firebase firebase-realtime-database chat groupchat


【解决方案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 是用户的 id 作为上面的键的值

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

这不是完美的代码,但我认为你明白了

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多