如何像WhatsApp一样根据日历日期和时间对聊天消息进行分组?

问题描述 投票:0回答:1

我正在开发聊天应用程序,但遇到问题。如果有人可以提供帮助,我想在一组消息(例如 WhatsApp)上显示日期和时间。例如我们有这个: enter image description here

我的消息 RecyclerView 适配器是这样的:

class SingleChatAdapter(private var context: Context, messageList: ArrayList<SingleChatData>?, senderRoom: String,
                        receiverRoom: String, private val incDecNum: (Boolean) -> Unit,
                        private val showChosenToolbar: (Boolean, Boolean) -> Unit):
    RecyclerView.Adapter<ViewHolder?>() {
    
    private var selectedShared = IsSelectedShared(context)
    private val sentNum = 1
    private val receivedNum = 2
    private val senderRoom: String
    private val receiverRoom: String
    private lateinit var messages: ArrayList<SingleChatData>
    private val itemsData: ArrayList<SelectedItemsData>?= null
    // Voice Player
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return if (viewType == sentNum){
            val view = LayoutInflater.from(parent.context).inflate(R.layout.sent_message_content, parent, false)
            SentMsgViewHolder(view)
        } else {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.received_message_content, parent, false)
            ReceivedMsgViewHolder(view)
        }
    }

    override fun getItemCount(): Int {
        return messages.size
    }

    override fun getItemViewType(position: Int): Int {
        val newMsg = messages[position]
        return if (FirebaseAuth.getInstance().uid == newMsg.senderId){
            sentNum
        } else {
            receivedNum
        }
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        //
    }

    inner class SentMsgViewHolder(itemView: View): ViewHolder(itemView){
        var binding = SentMessageContentBinding.bind(itemView)
        private var onItemClick: ((data: SingleChatData, weakImage: WeakReference<ImageView>) -> Unit)?= null
        var data: SingleChatData?= null
        init {
            onItemClick.let { onItemClick ->
                data?.let { data->
                    if (onItemClick != null) {
                        onItemClick(data, WeakReference(binding.sentImg))
                    }
                }
            }
        }
    }
    inner class ReceivedMsgViewHolder(itemView: View): ViewHolder(itemView){
        var binding = ReceivedMessageContentBinding.bind(itemView)
        private var onItemClick: ((data: SingleChatData, weakImage: WeakReference<ImageView>) -> Unit)?= null
        var data: SingleChatData?= null
        init {
            onItemClick.let { onItemClick ->
                data?.let { data->
                    if (onItemClick != null) {
                        onItemClick(data, WeakReference(binding.receivedImg))
                    }
                }
            }
        }
    }
    init {
        if (messageList != null){
            this.messages = messageList
        }
        this.senderRoom = senderRoom
        this.receiverRoom = receiverRoom
    }
}

我尝试了太多次寻找解决方案,但找不到正确的方法。 如果有人可以帮忙,谢谢。

android kotlin google-cloud-firestore android-recyclerview
1个回答
0
投票

您的数组中已经有两种项目类型。添加第三个项目类型 - DateMarker。浏览消息列表并在适当的地方插入日期标记。然后您可以将其显示为普通视图类型,并以您想要的任何方式定义其视图。

© www.soinside.com 2019 - 2024. All rights reserved.