使用Google的Paging3库时显示空状态

时间:2020-09-17 15:50:46

标签: android kotlin android-paging

我当前是第一次使用Google的Paging3库。我将代码基于他们位于https://codelabs.developers.google.com/codelabs/android-paging/#0的Codelab。

我的应用程序流程遵循以下规则:

  1. 显示为空状态
  2. 让用户搜索某些内容
  3. 显示结果
  4. 当用户按下搜索栏上的后退按钮时->再次显示空白状态

不幸的是,代码实验室无法处理空状态:(我正在使用以下addLoadStateListener来处理搜索结果:

adapter.addLoadStateListener { loadState ->
            // Only show the list if refresh succeeds.
            binding.userRecyclerView.isVisible = loadState.source.refresh is LoadState.NotLoading
            // Show loading spinner during initial load or refresh.
            binding.progressBar.isVisible = loadState.source.refresh is LoadState.Loading
            // Show the retry state if initial load or refresh fails.
            binding.errorMessage.isVisible = loadState.source.refresh is LoadState.Error
            if (binding.errorMessage.isVisible) {
                binding.errorMessage.text =
                    (loadState.source.refresh as LoadState.Error).error.toString()
            }
            binding.retryButton.isVisible = binding.errorMessage.isVisible

            // Toast on any error while loading more entries
            val errorState = loadState.source.append as? LoadState.Error
                ?: loadState.source.prepend as? LoadState.Error
                ?: loadState.append as? LoadState.Error
                ?: loadState.prepend as? LoadState.Error
            errorState?.let {
                Toast.makeText(
                    context,
                    resources.getString(R.string.error_loading),
                    Toast.LENGTH_LONG
                ).show()
            }
        }

如何使用addLoadStateListener显示空状态? LoadState仅具有三个可能的值:NotLoading,Loading和Error。但是,我并不总是想要显示RecyclerView。仅在有结果且用户未按下“后退”按钮时,它才可见。

有人可以指导我正确的方向吗?关于此问题是否有某种最佳实践?

谢谢!

1 个答案:

答案 0 :(得分:0)

以下一些API可能会有所帮助:

您可以使用PagingData.empty()创建一个空白的PagingData,然后提交以“清除”先前的PagingData,直到再次调用adapter.submitData。如果要在搜索之间或搜索之前显示空状态,这很有用。如果要显示一些静态内容,也可以使用PagingData.from(list)

要获取显示的商品数量,您可以使用adapter.itemCount

如果您需要专门检查刷新完成后加载了哪些项目,则可以使用adapter.peek(index)adapter.snapshot()一次获取所有项目(但价格更高)。