Optimize lazy column

This commit is contained in:
Benoit Marty
2022-11-23 17:00:16 +01:00
committed by Benoit Marty
parent 4ddf216bee
commit 89224744e5
2 changed files with 28 additions and 3 deletions

View File

@@ -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(

View File

@@ -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
}