diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index eaef076c63..f354dce2b6 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -10,7 +10,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi @@ -230,7 +230,11 @@ fun TimelineItems( verticalArrangement = Arrangement.Bottom, reverseLayout = true ) { - itemsIndexed(timelineItems) { index, timelineItem -> + items( + items = timelineItems, + contentType = { timelineItem -> timelineItem.contentType() }, + key = { timelineItem -> timelineItem.key() }, + ) { timelineItem -> TimelineItemRow( timelineItem = timelineItem, onClick = onClick, @@ -245,6 +249,20 @@ fun TimelineItems( } } +private fun MessagesTimelineItemState.key(): String { + return when (this) { + is MessagesTimelineItemState.MessageEvent -> id + is MessagesTimelineItemState.Virtual -> id + } +} + +private fun MessagesTimelineItemState.contentType(): Int { + return when (this) { + is MessagesTimelineItemState.MessageEvent -> 0 + is MessagesTimelineItemState.Virtual -> 1 + } +} + @Composable fun TimelineItemRow( diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt index 3880339503..fa9ef08a23 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt @@ -122,7 +122,11 @@ fun RoomListContent( .nestedScroll(nestedScrollConnection), state = lazyListState, ) { - items(roomSummaries) { room -> + items( + items = roomSummaries, + contentType = { room -> room.contentType() }, + key = { room -> room.key() }, + ) { room -> RoomSummaryRow(room = room, onClick = ::onRoomClicked) } } @@ -134,6 +138,9 @@ fun RoomListContent( } } +private fun RoomListRoomSummary.key() = id +private fun RoomListRoomSummary.contentType() = isPlaceholder + private fun LazyListState.isScrolled(): Boolean { return firstVisibleItemIndex > 0 || firstVisibleItemScrollOffset > 0 }