Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Does this library supports LazyVerticalGrid paging? #2

Closed
berhram opened this issue Nov 1, 2022 · 1 comment
Closed

Does this library supports LazyVerticalGrid paging? #2

berhram opened this issue Nov 1, 2022 · 1 comment

Comments

@berhram
Copy link

berhram commented Nov 1, 2022

No description provided.

@KevinnZou
Copy link
Owner

KevinnZou commented Nov 3, 2022

Thanks for your question. The answer is Yes! I add the support for LazyVerticalGrid in Version 0.0.3. I also provide an example of it in the Sample App. You can have a try and let me know if you have any questions!
The Apis are:

fun <T : Any> LazyGridScope.itemPaging(
    pagingData: LazyPagingItems<T>,
    span: Int,
    loadingContent: @Composable (() -> Unit)? = { DefaultLoadingContent() },
    noMoreContent: @Composable (() -> Unit)? = { DefaultNoMoreContent() },
    errorContent: @Composable ((retry: (() -> Unit)?) -> Unit)? = { retry ->
        DefaultErrorContent(
            retry
        )
    },
) {
    when (pagingData.loadState.append) {
        is LoadState.Loading -> loadingContent?.let { item(span = { GridItemSpan(span) }) { loadingContent() } }
        is LoadState.Error -> errorContent?.let { item(span = { GridItemSpan(span) }) { errorContent { pagingData.retry() } } }
        is LoadState.NotLoading ->
            if (pagingData.loadState.append.endOfPaginationReached && noMoreContent != null) {
                item(span = { GridItemSpan(span) }) { noMoreContent() }
            }

    }
}
fun <T : Any> LazyGridScope.itemsIndexed(
    items: LazyPagingItems<T>,
    itemContent: @Composable LazyGridItemScope.(index: Int, value: T?) -> Unit
) {
    items(items.itemCount) { index ->
        itemContent(index, items[index])
    }
}

You can use it like that:

@Composable
fun PagingGridScreen(viewModel: MainViewModel = hiltViewModel()) {
    val pagerData = viewModel.pager.collectAsLazyPagingItems()
    PagingListContainer(pagingData = pagerData) {
        LazyVerticalGrid(
            columns = GridCells.Fixed(2),
            verticalArrangement = Arrangement.spacedBy(10.dp),
            horizontalArrangement = Arrangement.spacedBy(10.dp),
            contentPadding = PaddingValues(10.dp)
        ) {
            itemsIndexed(pagerData) { index, value ->
                Box(
                    Modifier
                        .background(if (index.rem(2) == 0) Color.Yellow else Color.Magenta)
                        .height(128.dp),
                    contentAlignment = Alignment.Center
                ) {
                    Text(text = value.toString())
                }
            }
            if (pagerData.itemCount.rem(2) != 0) {
                item { Spacer(Modifier.background(Color.White)) }
            }
            itemPaging(pagerData, 2)
        }
    }
}

@berhram berhram closed this as completed Nov 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants