【发布时间】:2020-10-15 11:36:26
【问题描述】:
我正在使用 Paging 3 库。我可以检查刷新状态是“加载”还是“错误”,但我不确定如何检查“空”状态。我可以添加以下条件,但我不确定它是否正确
adapter.loadStateFlow.collectLatest { loadStates ->
viewBinding.sflLoadingView.setVisibility(loadStates.refresh is LoadState.Loading)
viewBinding.llErrorView.setVisibility(loadStates.refresh is LoadState.Error)
viewBinding.button.setOnClickListener { pagingAdapter.refresh() }
if(loadStates.refresh is LoadState.NotLoading && (viewBinding.recyclerView.adapter as ConcatAdapter).itemCount == 0){
viewBinding.llEmptyView.setVisibility(true)
}else{
viewBinding.llEmptyView.setVisibility(false)
}
}
我也遇到了其他问题 我已经实现了搜索功能,并且在输入超过 2 个字符之前,我使用的是相同的分页源,如下所示,但上面的 loadstate 回调只执行一次。这就是为什么如果清除搜索查询,我无法隐藏空视图。我是这样做是为了节省前端的 api 调用。
private val originalList : LiveData<PagingData<ModelResponse>> = Transformations.switchMap(liveData){
repository.fetchSearchResults("").cachedIn(viewModelScope)
}
val list : LiveData<LiveData<PagingData<ModelResponse>>> = Transformations.switchMap{ query ->
if(query != null) {
if (query.length >= 2)
repository.fetchSearchResults(query)
else
originalList
}else
liveData { emptyList<ModelResponse>() }
}
【问题讨论】:
-
repository.fetchSearchResults(query)的实现是什么样的,何时调用 submitData?你如何验证回调只被调用一次?您应该在任何状态更改(包括附加/前置)时收到一个新的 CombinedLoadStates。需要明确的是,您的条件检查 ConcatAdapter 的 itemCount,但我认为您只需要 PagingDataAdapter 的 itemCount,因为 ConcatAdapter 还将包括其他适配器(例如 LoadStateAdapter)。仅供参考:您可以使用submitData(PagingData.empty())清除列表。 -
fun fetchSearchResults(searchQuery : String): LiveData<PagingData<ModelResponse>> { return Pager( config = PagingConfig(pageSize = DEFAULT_PAGE_SIZE, enablePlaceholders = false), pagingSourceFactory = { ModelPagingSource(searchQuery) } ).liveData } -
@dlam 关于回调问题,在正常情况下它工作正常。如果查询长度小于 2,我正在尝试重用相同的分页源(originalList),并且在重用相同的 obj(originalList)之后,不执行 loadstate 回调方法,我认为这是对于一个分页源的预期行为,刷新 loadstate 将是仅在达到“错误”或“未加载”状态之前调用,并且在我们进行一些显式调用之前不会再次调用
-
你能解释一下如何检查列表中的空状态
-
你说得对,重复使用
PagingSource会导致问题。我会尝试过滤搜索输入,以便在您不想重新加载时不会最终重新加载,而不是尝试“重用”PagingSource。为了检查空状态,PagingDataAdapter.itemCount将在从 loadStateFlow / 侦听器调用时起作用(加载状态事件保证与插入事件同步发送,因此您可以确定已加载的页面已呈现)。还有一个.snapshot()方法,以防您需要查看自己呈现的实际项目。
标签: android