【问题标题】:Hide LaodingView when search have no result搜索无结果时隐藏LaodingView
【发布时间】:2023-01-20 19:43:44
【问题描述】:

我在我的应用程序中实现了搜索功能,它将结果显示为带分页的 verticalGridView:https://github.com/alirezaeiii/TMDb-Compose

我有以下刷新加载状态的逻辑,可以按我的意愿工作:

@Composable
fun <T : TMDbItem> PagingScreen(
    viewModel: BasePagingViewModel<T>,
    onClick: (TMDbItem) -> Unit,
) {
    val lazyTMDbItems = viewModel.pagingDataFlow.collectAsLazyPagingItems()

    when (lazyTMDbItems.loadState.refresh) {
        is LoadState.Loading -> {
            TMDbProgressBar()
        }
        is LoadState.Error -> {
            val message =
                (lazyTMDbItems.loadState.refresh as? LoadState.Error)?.error?.message ?: return

            lazyTMDbItems.apply {
                ErrorScreen(
                    message = message,
                    modifier = Modifier.fillMaxSize(),
                    refresh = { retry() }
                )
            }
        }
        else -> {
            LazyTMDbItemGrid(lazyTMDbItems, onClick)
        }
    }
}

在 LazyTMDbItemGrid 中,我尝试按如下方式管理附加加载状态:

@Composable
private fun <T : TMDbItem> LazyTMDbItemGrid(
    lazyTMDbItems: LazyPagingItems<T>,
    onClick: (TMDbItem) -> Unit,
) {
    LazyVerticalGrid(
        columns = GridCells.Fixed(COLUMN_COUNT),
        contentPadding = PaddingValues(
            start = Dimens.GridSpacing,
            end = Dimens.GridSpacing,
            bottom = WindowInsets.navigationBars.getBottom(LocalDensity.current)
                .toDp().dp.plus(
                    Dimens.GridSpacing
                )
        ),
        horizontalArrangement = Arrangement.spacedBy(
            Dimens.GridSpacing,
            Alignment.CenterHorizontally
        ),
        content = {

            repeat(COLUMN_COUNT) {
                item {
                    Spacer(
                        Modifier.windowInsetsTopHeight(
                            WindowInsets.statusBars.add(WindowInsets(top = 56.dp))
                        )
                    )
                }
            }

            items(lazyTMDbItems.itemCount) { index ->
                val tmdbItem = lazyTMDbItems[index]
                tmdbItem?.let {
                    TMDbItemContent(
                        it,
                        Modifier
                            .height(320.dp)
                            .padding(vertical = Dimens.GridSpacing),
                        onClick
                    )
                }
            }

            lazyTMDbItems.apply {
                when (loadState.append) {
                    is LoadState.Loading -> {
                        item(span = span) {
                            LoadingRow(modifier = Modifier.padding(vertical = Dimens.GridSpacing))
                        }
                    }
                    is LoadState.Error -> {
                        val message =
                            (loadState.append as? LoadState.Error)?.error?.message ?: return@apply

                        item(span = span) {
                            ErrorScreen(
                                message = message,
                                modifier = Modifier.padding(vertical = Dimens.GridSpacing),
                                refresh = { retry() })
                        }
                    }
                    else -> {}
                }
            }
        })
}

问题是当没有搜索结果时,或者当结果项小于屏幕尺寸时,它会显示 LoadingRow。我的期望是当我们处于这种状态时,LoadingRow 不显示,但我如何检测这种状态?

【问题讨论】:

  • 您可以将状态传递给您的 LoadingRow,然后使用它来显示/隐藏该元素。我做过类似的事情,你可以看看here

标签: android android-jetpack-compose android-paging


【解决方案1】:

如果我错了请纠正我,但这些应该由 PagingSource.LoadResult.Page 决定

文档:

PagingSource.load 的成功结果对象。参数:数据 - 已加载 data prevKey - 如果可以加载更多数据,则为上一页的键 那个方向,否则为 null。 nextKey - 下一页的键(如果有) 可以在该方向加载数据,否则为 null。

因此,如果您到达分页结束(在任一方向):

PagingSource.LoadResult.Page(
        data = loadedData,
        prevKey = null,
        nextKey = null)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多