Вот код:-
Код: Выделить всё
data class AutoScrollingModel(val key: UUID = UUID.randomUUID(), @DrawableRes val iconResource: Int, val contentDescription: String, var isFabricated: Boolean = false)
val autoScrollingList = listOf(
AutoScrollingModel(iconResource = R.drawable.apple, contentDescription = "Apple"),
AutoScrollingModel(iconResource = R.drawable.banana, contentDescription = "Banana"),
AutoScrollingModel(iconResource = R.drawable.cherries, contentDescription = "cherries"),
AutoScrollingModel(iconResource = R.drawable.dates, contentDescription = "dates"),
)
< /code>
Код Compose напоминает это:-< /p>
@Composable
fun MainUi(modifier: Modifier) {
val lazyListState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
var source by remember { mutableStateOf(autoScrollingList) }
LaunchedEffect(lazyListState) {
val visibleItemsInfo = lazyListState.layoutInfo.visibleItemsInfo
if (visibleItemsInfo.isEmpty()) return@LaunchedEffect
val lastVisibleItem = visibleItemsInfo.last()
val viewportDimension = lazyListState.layoutInfo.viewportEndOffset + lazyListState.layoutInfo.viewportStartOffset
if (source.size == (viewportDimension / lastVisibleItem.size) + 1) {
val transitional = (source + source[0].copy(key = UUID.randomUUID(), isFabricated = true))
source = ArrayList(transitional)
}
}
Box {
LazyRow(
state = lazyListState,
modifier = Modifier
) {
itemsIndexed(source, key = { _, item -> item.key }) { index, item ->
AutoScrollingName(autoScrollingModel = source[index])
Spacer(modifier = Modifier.width(5.dp))
}
}
}
LaunchedEffect(Unit) {
snapshotFlow { lazyListState.layoutInfo }
.filter { it.visibleItemsInfo.isNotEmpty() }
.distinctUntilChanged()
// .onStart {
// val visibleItemsInfo = lazyListState.layoutInfo.visibleItemsInfo
// if (visibleItemsInfo.isEmpty()) return@onStart
// val lastVisibleItem = visibleItemsInfo.last()
// val viewportDimension = lazyListState.layoutInfo.viewportEndOffset + lazyListState.layoutInfo.viewportStartOffset
//
// if (source.size == (viewportDimension / lastVisibleItem.size) + 1) {
// val transitional = (source + source[0].copy(key = UUID.randomUUID(), isFabricated = true))
// source = ArrayList(transitional)
// }
// }
.collectLatest {
if (lazyListState.firstVisibleItemIndex == 0) source = ArrayList(source)
else {
val historicList = ArrayList(source.subList(1, source.size))
source =
if (source.last().isFabricated)
ArrayList(historicList.onEach { it.isFabricated = false } + historicList.first().copy(key = UUID.randomUUID(), isFabricated = true))
else
ArrayList(historicList + source.first())
}
}
}
LaunchedEffect(key1 = Unit) {
coroutineScope.launch {
while (true) {
lazyListState.autoScroll()
}
}
}
}
< /code>
Этот код работает нормально, использую ли я это < /p>
LaunchedEffect(lazyListState) {
val visibleItemsInfo = lazyListState.layoutInfo.visibleItemsInfo
if (visibleItemsInfo.isEmpty()) return@LaunchedEffect // ALWAYS TRUE
val lastVisibleItem = visibleItemsInfo.last()
val viewportDimension = lazyListState.layoutInfo.viewportEndOffset + lazyListState.layoutInfo.viewportStartOffset
if (source.size == (viewportDimension / lastVisibleItem.size) + 1) {
val transitional = (source + source[0].copy(key = UUID.randomUUID(), isFabricated = true))
source = ArrayList(transitional)
}
}
< /code>
или это:-< /p>
// .onStart {
// val visibleItemsInfo = lazyListState.layoutInfo.visibleItemsInfo
// if (visibleItemsInfo.isEmpty()) return@onStart // ALWAYS TRUE
// val lastVisibleItem = visibleItemsInfo.last()
// val viewportDimension = lazyListState.layoutInfo.viewportEndOffset + lazyListState.layoutInfo.viewportStartOffset
//
// if (source.size == (viewportDimension / lastVisibleItem.size) + 1) {
// val transitional = (source + source[0].copy(key = UUID.randomUUID(), isFabricated = true))
// source = ArrayList(transitional)
// }
// }
Проблема, по -видимому, заключается в том, что VisibleItemSinfo.isempty () всегда верно как в блоках OnStart , так и в запуске в моем производственном приложении, где в моем приложение Spike. Список заполнен.
Подробнее здесь: https://stackoverflow.com/questions/794 ... emsinfo-is
Мобильная версия