android 搜索无结果时隐藏LaodingView

ddarikpa  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(92)

我已经在我的应用程序中实现了搜索功能,将结果显示为带分页的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不显示,但是我如何检测这种状态呢?

ovfsdjhp

ovfsdjhp1#

如果我说错了请纠正我,但这些应该由PagingSource.LoadResult.Page决定
文件:
PagingSource.load的成功结果对象。参数:data-加载的数据prevKey-如果在该方向上可以加载更多数据则为上一页的键,否则为空。nextKey-如果在该方向上可以加载更多数据则为下一页的键,否则为空。
因此,如果到达分页末尾(在任一方向上):

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

相关问题