嘿,我正在努力通過列舉類創建一個INCOMING、OUTGOING和TIME型別的串列。我的資料類是通過 api 呼叫填充的,并根據串列中的填充。我想修改以在日期結束當前日期時添加 TIME 列舉值。
fun main() {
val list = mutableListOf(
Conversation(ConversationType.INCOMING.value, Sender(1, "2021/10/12")),
Conversation(ConversationType.INCOMING.value, Sender(2, "2021/10/12")),
Conversation(ConversationType.OUTGOING.value, Sender(3, "2021/10/11")),
Conversation(ConversationType.OUTGOING.value, Sender(4, "2021/10/11")),
Conversation(ConversationType.OUTGOING.value, Sender(5, "2021/10/11")),
Conversation(ConversationType.OUTGOING.value, Sender(6, "2021/10/09")),
Conversation(ConversationType.INCOMING.value, Sender(7, "2021/10/09")),
Conversation(ConversationType.INCOMING.value, Sender(8, "2021/10/09")),
Conversation(ConversationType.INCOMING.value, Sender(9, "2021/10/09")),
Conversation(ConversationType.OUTGOING.value, Sender(10, "2021/10/08")),
Conversation(ConversationType.OUTGOING.value, Sender(11, "2021/10/07"))
)
}
列舉類
enum class ConversationType(val value: Int) {
INCOMING(1),
TIME(0),
OUTGOING(2);
}
data class Conversation(
val type: Int? = null,
val sender: Sender
)
data class Sender(
val id: Int? = null,
val date: String? = null
)
我需要這樣的輸出
Conversation(type=1, sender=Sender(id=1, date=2021/10/12))
Conversation(type=1, sender=Sender(id=2, date=2021/10/12))
Conversation(type=0, sender=Sender(id=null, date=2021/10/12))
Conversation(type=2, sender=Sender(id=3, date=2021/10/11))
Conversation(type=2, sender=Sender(id=4, date=2021/10/11))
Conversation(type=2, sender=Sender(id=5, date=2021/10/11))
Conversation(type=0, sender=Sender(id=null, date=2021/10/11))
Conversation(type=2, sender=Sender(id=6, date=2021/10/09))
Conversation(type=1, sender=Sender(id=7, date=2021/10/09))
Conversation(type=1, sender=Sender(id=8, date=2021/10/09))
Conversation(type=1, sender=Sender(id=9, date=2021/10/09))
Conversation(type=0, sender=Sender(id=null, date=2021/10/09))
Conversation(type=2, sender=Sender(id=10, date=2021/10/08))
Conversation(type=0, sender=Sender(id=null, date=2021/10/08))
Conversation(type=2, sender=Sender(id=11, date=2021/10/07))
Conversation(type=0, sender=Sender(id=null, date=2021/10/07))
uj5u.com熱心網友回復:
其他人已經提供了基于手動迭代索引的解決方案。更容易閱讀的替代方法是使用可變迭代器。生成的代碼與您最初的嘗試幾乎相同:
val iter = list.listIterator()
var previousDate = iter.next().sender?.date
iter.forEach { conversation ->
val date = conversation.sender?.date
if (date != previousDate) {
iter.add(Conversation(...))
previousDate = date
}
}
使用可變迭代器,我們可以在迭代程序中需要的地方添加一個專案。我們不需要手動管理索引。
如果串列為空,此解決方案將引發例外,因此我們可能應該為這種情況添加檢查。您還應該考慮 wheresender或dateis的情況null。到目前為止提供的所有解決方案在這種情況下都會表現得很奇怪,并且您沒有指定您的預期行為。
uj5u.com熱心網友回復:
據我了解你想要什么,你需要這樣的東西:
var previousDate: String? = null
var i = -1
while (i < list.size) {
i
val currentDate = list[i].date
previousDate?.let {
if (currentDate != previousDate) {
list.add(i 1, Conversation(ConversationType.TIME.value, Sender(null, it)))
}
}
previousDate = currentDate
}
uj5u.com熱心網友回復:
由于您想在迭代串列時將專案添加到串列中,因此您需要迭代索引,以便隨時插入專案。由于串列會隨著您的進行而增長,您需要使用 while 回圈而不是帶有原始索引的 for 回圈。
var previousDate: String? = null
var i = 0
while (i < list.size) {
val newDate = list[i].date
if (newDate != previousDate && previousDate != null) {
list.add(i , Conversation(ConversationType.TIME.value, Sender(null, previousDate)))
}
previousDate = newDate
i
}
為了解釋我關于簡化使用密封介面的建議,這里是我將如何重新設計。我會將您的上述課程替換為:
sealed interface Conversation {
val date: String
}
sealed interface ConversationMessage: Conversation {
val senderId: Int
}
data class IncomingConversation(
override val date: String,
override val senderId: Int
): ConversationMessage
data class OutgoingConversation(
override val date: String,
override val senderId: Int
): ConversationMessage
data class TimeStampConversation(override val date: String): Conversation
那么你就不必擔心任何東西為空,你不必解壓列舉值,而且所有的建構式都更容易使用。您可以使用when帶有is檢查的陳述句來確定在您的 RecyclerView 中使用哪個視圖持有者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312854.html
