嘿,我正在開發聊天應用程式。我從
如何實作其他功能。
1.由于我的串列太大,如何對我的日期進行分類以有效地顯示每天對話之間的日期。我剛剛添加了示例
2.如何在用戶滾動聊天時顯示日期滾動效果,就像whatsapp有昨天、今天和其他日期格式一樣。
3.在上面的串列示例中,添加了一個屬性,這意味著在群聊中添加了某人。在 whatsapp XYZ 中使用群組邀請鏈接加入。
我正在添加 whatsapp 的螢屏截圖

uj5u.com熱心網友回復:
盡管目前還不清楚是什么,你的意思是“這不是我的解決方案的作業”,我不知道這個問題是一個崩潰或空串列或...但檢查方法項的邏輯areItemsTheSame和areContentsTheSame是錯誤的:該方法areItemsTheSame用于檢查舊專案的身份是否等于新專案的身份。并且該方法areContentsTheSame用于檢查2項中的值是否相等
所以areContentsTheSame你只需要檢查id專案,因為其他東西是專案的值,你寫的東西areContentsTheSame沒有意義,因為你只是檢查專案的參考。所以把它改成這樣:
private val MESSAGE_COMPARATOR = object : DiffUtil.ItemCallback<MM>() {
override fun areItemsTheSame(oldItem: MM, newItem: MM): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: MM, newItem: MM): Boolean {
return ((oldItem.added == newItem.added)
&& (oldItem.addedTime == newItem.addedTime)
&& (oldItem.sentAt == newItem.sentAt)
&& (oldItem.text == newItem.text)) }
}
uj5u.com熱心網友回復:
的持有人在哪里TimingViewHolder?
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is IncomingViewHolder) {
holder.bindItem(getItem(position))
} else if (holder is OutGoingViewHolder) {
holder.bindItem(getItem(position))
}
}
[更新]
如何對我的日期進行分類以顯示每天對話之間的日期效率低下,因為我的串列太大了。
你想把對話UI做成這樣嗎?

如果是,您可以嘗試這種方法,為了清楚地解釋,我需要更改您的代碼。
資料類MessageEntry// 它來自服務器,它是原始資料
資料類Message// 它來自 MessageEntry
data class MessageEntry(
val id: String? = null,
val text: String? = null,
val time: String? = null,
val type: String? = null,
val name: String? = null
)
確保類 Message 中沒有可為空的欄位
data class Message(
val id: String,
val text: String,
val time: Date, // SDK's class
val type: String, // It's better to use enum
val name: String
)
//Raw data from Server
val mutableRawList = mutableListOf<MessageEntry>(
MessageEntry(id = "1", text = "avc", time = "2021-10-08T15:34:00", type = "outgoing"),
MessageEntry(id = "2", text = "dsds", time = "2021-10-08T15:36:00", type = "incoming"),
MessageEntry(id = "3", type = "added", time = "2021-10-08T00:00:00", name = "ABC"),
MessageEntry(id = "4", type = "added", time = "2021-10-07T15:50:00", name = "XYZ"),
MessageEntry(id = "5", text = "asvc", time = "2021-10-07T15:46:00", type = "outgoing"),
MessageEntry(id = "6", text = "asvc", time = "2021-10-07T15:46:00", type = "incoming"),
MessageEntry(id = "6", text = "asvc", time = "2021-10-06T12:34:00", type = "outgoing"),
MessageEntry(id = "8", text = "asvc", time = "2021-10-06T12:50:00", type = "incoming"),
MessageEntry(id = "9", type = "added", time = "2021-10-06T12:46:00", name = "DEF")
)
//I ignore the changing, MessageEntry.toMessage(), for an instance.
val mutableMessageList = mutableListOf<Message>(
Message(id = "1", text = "avc", time = Date(2021-10-08T15:34:00), type = "outgoing"),
Message(id = "2", text = "dsds", time = Date(2021-10-08T15:36:00), type = "incoming"),
Message(id = "3", type = "added", time = Date(2021-10-08T00:00:00), name = "ABC"),
Message(id = "4", type = "added", time = Date(2021-10-07T15:50:00), name = "XYZ"),
Message(id = "5", text = "asvc", time = Date(2021-10-07T15:46:00), type = "outgoing"),
Message(id = "6", text = "asvc", time = Date(2021-10-07T15:46:00), type = "incoming"),
Message(id = "6", text = "asvc", time = Date(2021-10-06T12:34:00), type = "outgoing"),
Message(id = "8", text = "asvc", time = Date(2021-10-06T12:50:00), type = "incoming"),
Message(id = "9", type = "added", time = Date(2021-10-06T12:46:00), name = "DEF")
)
private var lastMessageDate: Date? = null
...
val adapter = ConversationAdapter()
binding.conversationRecyclerView.adapter = adapter
// Need to change raw list MessageEntry to Message
// TODO, maybe you should change the related code of xxxAdapter, xxxViewHolder...
adapter.submitList(mutableMessageList.toFlatMessageItems)
有什么方法 toFlatMessageItems()
//Rebuild the message list from TreeMap<Date, List<Message>>
private fun MutableList<Message>.toFlatMessageItems() =
mutableListOf<Message>().apply {
val messageByDate = this@toFlatMessageItems.splitByDate()
for (time in messageByDate.keys) {
if (time != lastMessageDate) {
val dateHeaderItem = time.toMessage()
add(dateHeaderItem)
}
for (message in messageByDate.getValue(date)) {
val messageItem = message
add(messageItem)
}
}
lastMessageDate = messageByDate.keys.lastOrNull()
}
方法是什么splitByDate:
//Split the data by Date
private fun List<Message>.splitByDate() =
TreeMap<Date, List<Message>>(Collections.reverseOrder()).apply {
for (message in this@splitByDate) {
val date = Message.time.noTime() // need you implement noTime() extension function, only the (year, month, day)
var value = this[date] as MutableList<Message>?
if (value == null) {
value = mutableListOf()
this[date] = value
}
value.add(message)
}
}
Kotlin 擴展函式
- Change MessageEntry to Message
MessageEntry.toMessage() = Message(
id = id ?: "", // or add an extension fuction to set empty string
text = text ?: "",
time = time.toDate(), // extension function from time string to Date, for spliting date
type = type ?: "",
name = name ?: ""
)
- time(String or Long) to Date
String/Long.toDate(): Date {
//TODO change string/long time format to Date
}
- Date.noTime()
Date.toDate(): Date {
//TODO, only year, month, day
}
- Date.toMessage()
Date.toMessage() = Message(
id = "",
text = "",
time = time, // the type of time is Date
type = "added",
name = ""
)
Note:
- I didn't test it, just show you an idea.
- Using MutableList or List, it's up to you.
- Some extension functions need you to finish them.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/326270.html
