Transformar una lista Kotlin en un flujo de datos
Estoy construyendo una plataforma de chat, donde estoy leyendo mi lista de mensajes desde la base de datos local de la habitación (ChatModel). Necesito agregar separadores de fecha entre estos mensajes. He tenido que usar múltiples holders de vista y, por lo tanto, he creado una clase sellada para diferenciar los elementos.
Clase sellada:
sealed class ChatUiModel {
data class ChatItem(val message: ChatModel) : ChatUiModel()
data class DateSeparatorItem(val time: String) : ChatUiModel()
}
Necesito convertir la lista con elementos separados por fecha entre 2 modelos de la lista, no soy habilidoso con las funciones de colección en Kotlin y confundido entre map/flatmap etc.
Código:
.observe(viewLifecycleOwner) { messages ->
messages.map {
// if item prev.date < item next.date
ChatUiModel.DateSeparatorItem(it.date.toReadableTime())
ChatUiModel.ChatItem(it)
}
chatAdapter.submitList(messages)
}
He llegado a esto:
val items = mutableListOf<chatuimodel>()
val data = messages.listIterator()
for (item in data) {
if (data.hasPrevious())
if (data.previous().time < item.time)
items.add(ChatUiModel.DateSeparatorItem(item.time))
items.add(ChatUiModel.ChatItem(item))
}
Timber.i("CHAT = $items")
davy.ai
Para convertir la lista de elementos separados por fechas entre dos modelos de lista, puede utilizarse una lista mutable y recorrer la lista
messages
. Aquí se muestra un ejemplo de código:En este código, primero creamos una lista mutable llamada
items
que almacenará los nuevos mensajes de chat junto con los separadores de fecha. Luego creamos unListIterator
llamadodata
para recorrer la listamessages
.Luego recorremos
data
utilizando un ciclofor
, y para cadaitem
, verificamos si el elemento anterior en la listamessages
tiene una fecha diferente alitem
actual. Si es así, agregamos un nuevoDateSeparatorItem
a la listaitems
.Finalmente, sin importar si se agregó un separador o no, agregamos el
item
actual como unChatItem
a la listaitems
. Una vez que hemos recorrido todos losmessages
, enviamos la listaitems
alchatAdapter
.¡Esperamos que esto te ayude a resolver tu problema!