【问题标题】:How to display sender name in group chat [closed]如何在群聊中显示发件人姓名[关闭]
【发布时间】:2021-02-23 05:28:56
【问题描述】:

我正在使用firebase 为安卓开发一个聊天应用程序。所以我想在来自同一发件人的第一条消息的上方显示发件人姓名,但我在发件人发送的每条消息上都获得发件人姓名,

sender name bug image

我使用的逻辑

dbRef.child("Group chats").child(chat.getGroupId())
                .addValueEventListener(object : ValueEventListener {
                    override fun onDataChange(snapshot: DataSnapshot) {
                        for (dataSnapshot in snapshot.children) {
                            val mChat = dataSnapshot.getValue(Chat::class.java)
                            val previousChat = if (position > 0) {
                                mChatList[position - 1]
                            } else {
                                mChat
                            }

                            if ( previousChat?.getSender() == mChat?.getSender() ){
                                holder.senderName?.visibility = GONE
                            }
                            else {
                                holder.senderName?.visibility = VISIBLE
                                holder.senderName?.text = chat.getSenderName()
                            }
                        }
                    }
                    override fun onCancelled(error: DatabaseError) {
                    }
                })

【问题讨论】:

    标签: android arrays firebase kotlin firebase-realtime-database


    【解决方案1】:

    我想我已经让你知道了,我已经想通了,并且正在编写我的代码

    第 1 步。引入一个函数来获取最后一次聊天的发件人

     private fun getTheRecentSender(position: Int): String? {
        val lastMessagePosition = position - 1
        //return the 1st message if messages chat thread is empty
        val chat = chatMessageThread[if (lastMessagePosition < 0) 0 else lastMessagePosition]
        //get and return the sender of the last message
        return chat.from
    }
    

    第 2 步。比较之前的聊天发件人,如果是同一发件人,则隐藏姓名

      override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val viewType = getItemViewType(position)
        val chat = chatMessageThread[position]
    
        //for incoming chat
        if (viewType == 1) {
            (holder as InComingViewHolder).itemBinding.msg = chat
    
            //hide sender's name if previous chat came from the same sender
            holder.itemBinding.msgFrom.visibility =
                if (chat.from == getTheRecentSender(position)) View.GONE else View.VISIBLE
        }
        //for outgoing chat
        else {
            (holder as OutGoingViewHolder).itemBinding.msg = chat
    
            //hide sender's name if previous chat came from the same sender
            holder.itemBinding.msgFrom.visibility =
                if (chat.from == getTheRecentSender(position)) View.GONE else View.VISIBLE
        }
    }
    

    这是我的屏幕截图

    现在让我尝试使用上面的代码进行模拟

    【讨论】:

    • 嘿兄弟@tonnie你太棒了,你很容易解决了我的问题。非常感谢?。但它有一个小错误,即名称在第一条消息上不可见。正如我在问题发件人姓名中附加的图片在最顶部的问候消息中不可见!
    • 嘿@Tonnie 请尝试回答这个问题stackoverflow.com/q/64857715/14617810
    【解决方案2】:

    @先生。 groot 正在开发一个类似的应用程序,并在我的 RecyclerView onBind 方法中实现了这一目标

    //maps data to the children
    override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
    
        //it is called for each row
        val message = messageDataSet[position]
        holder.fromTextView.text = message.from
    
        holder.msgTextView.text = message.messageString
        holder.timeStampTextView.text = message.timestamp?.dateToString("hh:mm a E dd-MMM")
    
    }
    

    我有一个名为 Message 的数据类和一个名为 messageDataSet 的 Message 对象列表。我有一个带有 textViews 的 recyclerView 的行布局,如下所示。

    如果这有帮助,请告诉我

    【讨论】:

    • 嘿@tonnie 我也在使用适配器,我提供的代码在 onBindViewHolder() 中,所以你所做的并不是真正的解决方案,我的意思是你共享的代码将在每个消息,假设有来自 1 个发件人的连续 3 条消息,那么发件人名称将显示在每 3 条消息上,这是我的问题。所以所需的解决方案是该名称将仅显示在 3 条消息中的第一条消息上。你可以看到我在问题中附加的问题的图像。
    猜你喜欢
    • 2023-02-23
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多