Kotlin对话列表按日期分组后追加TIME枚举类型项的实现问题
实现方案
你需要的逻辑可以通过遍历列表按日期分组,每组末尾插入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")) ) val result = mutableListOf<Conversation>() var lastProcessedDate: String? = null list.forEachIndexed { index, item -> val currentDate = item.sender.date // 日期切换时给上一组追加时间标记 if (currentDate != lastProcessedDate && lastProcessedDate != null) { result.add(Conversation(ConversationType.TIME.value, Sender(date = lastProcessedDate))) } result.add(item) lastProcessedDate = currentDate // 遍历到末尾时追加最后一组的时间标记 if (index == list.size - 1) { result.add(Conversation(ConversationType.TIME.value, Sender(date = currentDate))) } } // 输出验证 result.forEach(::println) } // 原定义保持不变 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))
如果后续API返回的列表未按日期连续排列,只需要在处理前先对列表按sender.date倒序排序即可,核心逻辑无需调整。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

