Ошибка LazyColumn: требуется LazyPagingItems<TypeVariable(T)>, но найден List<T>

я используюPaging 3библиотека с и я хочу отсортировать список в соответствии с категорией элементов списка покупок. В приведенном ниже кодеLazyColumnжалуется, что ожидаетLazyPagingItems<TypeVariable(T)>дляitemsимущество, но найденоList<ShoppingListItem?>. Как я могу это исправить?

Составной

      val lazyListState = rememberLazyListState()
val successItems = allItemsState.allItems?.collectAsLazyPagingItems()

LazyColumn(
    state = lazyListState,
    modifier = Modifier
        .fillMaxWidth(),
    contentPadding = PaddingValues(
        start = 5.dp,
        end = 5.dp,
        top = 8.dp,
        bottom = 165.dp
    ),
    verticalArrangement = Arrangement.spacedBy(5.dp),
) {
    val groupedByCategory = successItems!!.itemSnapshotList.groupBy { it!!.category }

    groupedByCategory.forEach { (initial, shoppingListItems) ->
        item {
            Text(text = initial)
        }
        items(
            items = shoppingListItems, //Throws error at this line
            key = { item ->
                item.id
            }
        ) { item ->
            ShoppingListScreenItem(
                item = item,
                mainViewModel = shoppingListScreenViewModel,
                onNavigateToAddEditItemScreenFromItemStrip = { shoppingListItem ->
                    onNavigateToAddEditItemScreenFromItemStrip(shoppingListItem)
                },
            ) { isChecked ->
                scope.launch {
                    shoppingListScreenViewModel.changeItemChecked(
                        item,
                        isChecked
                    )
                }
            }
            Divider(color = Color.LightGray, thickness = 1.dp)
        }
    }
}

Сообщение об ошибке

      Type mismatch.

Required:
LazyPagingItems<TypeVariable(T)>
Found:
List<ShoppingListItem?>

4 ответа

The items(LazyPagingItems)функция была удалена из более новых версий библиотеки, возможно, поэтому вам не удалось найти файл import. Это было сделано для того, чтобы сделать API более гибким и обеспечить поддержку всех типовLazyContainers.

Согласно примечаниям к выпуску здесь: Paging Compose Version 1.0.0-alpha20, следует использовать следующий подход:

      val lazyPagingItems = pager.collectAsLazyPagingItems()

LazyVerticalGrid(columns = GridCells.Fixed(2)) {
  // Here we use the standard items API
  items(
    count = lazyPagingItems.itemCount,
    // Here we use the new itemKey extension on LazyPagingItems to
    // handle placeholders automatically, ensuring you only need to provide
    // keys for real items
    key = lazyPagingItems.itemKey { it.uniqueId },
    // Similarly, itemContentType lets you set a custom content type for each item
    contentType = lazyPagingItems.itemContentType { "contentType" }
  ) { index ->
    // As the standard items call provides only the index, we get the item
    // directly from our lazyPagingItems
    val item = lazyPagingItems[index]
    PagingItem(item = item)
  }
}

Соответствующийimportв этом случае требуется заявление.

ЕслиLazyColumnиспользуетList<T>дляitemsDSL, то требуется следующий оператор импорта:

      import androidx.compose.foundation.lazy.items

Но, если он используетLazyPagingItems<TypeVariable(T)>, затем используйте следующий оператор импорта:

      import androidx.paging.compose.items

И оба импорта можно использовать одновременно, если, например, вы используете условную логику для загрузки любого из типов коллекций.

Просто как чтоV Mircanсказали, что удалили. Но вы можете написать свой собственный, например:

      import androidx.compose.foundation.lazy.LazyItemScope
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.runtime.Composable
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.itemContentType
import androidx.paging.compose.itemKey

fun <T: Any> LazyListScope.items(
    items: LazyPagingItems<T>,
    key: ( (T) -> Any )? = null,
    contentType: ( (T) -> Any )? = null,
    itemContent: @Composable LazyItemScope.(T) -> Unit
) {
    items(
        items.itemCount,
        key = items.itemKey(key),
        contentType = items.itemContentType(contentType)
    ) loop@ { i ->
        val item = items[i] ?: return@loop
        itemContent(item)
    }
}

Затем вы можете использовать его как другиеitems. Надеюсь, это поможет.

У меня это работает. Попробуйте это:

Привет, пожалуйста, попробуйте один раз:

      listData?.let {
            items(it) { item ->
                ProductElement(
                    drawable = R.drawable.picture,
                    title = item.title,
                    brand = item.brand,
                    prize = "${item.price}"
                )
            }
        }