Android Compose Snapshotflow для Infinite Paging Slide Show: VisibleItemsInfo.isempty () всегда правдаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android Compose Snapshotflow для Infinite Paging Slide Show: VisibleItemsInfo.isempty () всегда правда

Сообщение Anonymous »

Я исследовал бесконечную прокрутку в Compose и работал, как это требуется в всплеске, над которым я работал недавно ...
Вот код:-

Код: Выделить всё

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)
//                    }
//                }
Однако, когда я включил этот код в свое производственное приложение. В боковом шоу анимация работает только один раз, а не в неопределенном отношении. /p>
Проблема, по -видимому, заключается в том, что VisibleItemSinfo.isempty () всегда верно как в блоках OnStart , так и в запуске в моем производственном приложении, где в моем приложение Spike. Список заполнен.

Подробнее здесь: https://stackoverflow.com/questions/794 ... emsinfo-is
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»