提交新的分页数据时如何清除适配器?

Posted

技术标签:

【中文标题】提交新的分页数据时如何清除适配器?【英文标题】:How to clear adapter when new paging data is submitted? 【发布时间】:2021-11-20 10:13:23 【问题描述】:

我有一个简单的分页搜索,可以在用户键入时查询服务器:

视图模型

private val searchTextStream = MutableStateFlow("")

val itemsStream: LiveData<PagingData<Item>> = searchTextStream
    .debounce(Duration.milliseconds(400))
    .flatMapLatest 
        val filter = ItemsFilter(name = it)
        getItemsStreamUseCase(filter)
    
    .cachedIn(viewModelScope)
    .asLiveData()

fun search(text: String) 
    searchTextStream.value = text

Fragment 中,我观察此流并将其设置为 PagingDataAdapter:

viewModel.itemsStream.observeWithViewLifecycleOwner 
    adapter.submitData(viewLifecycleOwner.lifecycle, it)


现在,每当我触发新搜索时,我都会收到新的PagingData,然后我将其设置为适配器。 执行此操作后,CombinedLoadStates.refreshLoadState.Loading 但未清除适配器!

这意味着当我更改搜索时,适用于其他不更改内容的列表的以下加载处理会在旧数据之上显示 swipe2refresh 指示器,而不是全屏加载占位符(我的搜索也支持 swipe2refresh)查询:

adapter.loadStateFlow
    .onEach 
        val showLoadingPlaceholder = it.refresh is LoadState.Loading && adapter.itemCount < 1
        val showSwipeRefreshIndicator = it.refresh is LoadState.Loading && adapter.itemCount > 0
        ...
        ...
    
    .launchIn(viewLifecycleOwner.lifecycleScope)

当提交新的分页数据以显示全屏加载占位符而不是 swipe2refresh 指示器时,是否有可能清除适配器数据?

【问题讨论】:

发布您的DataSource 【参考方案1】:

现在我决定在返回新的搜索流时始终发出 PagingData.empty()

val itemsStream: LiveData<PagingData<Item>> = searchTextStream
    .debounce(Duration.milliseconds(400))
    .flatMapLatest 
        val filter = ItemsFilter(name = it)
        val stream = getItemsStreamUseCase(filter).cachedIn(viewModelScope)
        stream.onStart  emit(PagingData.empty()) 
    
    .asLiveData()

【讨论】:

以上是关于提交新的分页数据时如何清除适配器?的主要内容,如果未能解决你的问题,请参考以下文章

如何清空 Recyclerview数据

如何找出分页数据适配器中的第一项已更改

Android ListView清除

ListView数据在滚动时被清除[重复]

ListView数据在滚动时被清除[重复]

如何清除 ExpandableListView?