gpt4 book ai didi

android - PagedListAdapter 重新加载没有占位符的数据

转载 作者:太空狗 更新时间:2023-10-29 13:44:45 26 4
gpt4 key购买 nike

我正在使用 PagedListAdapter 并且必须在屏幕恢复时重新加载数据。
对于这种情况,我不想在加载数据时清除适配器并将其显示为空或占位符。
我想显示以前的数据,并在收到新数据后用差异更新它。
但是现在,当我执行 dataSource.invalidate() 时,它会立即提交一个空列表,这会导致清除适配器并显示占位符。

现在我的代码是这样的:

class PortfolioListDataSource(
private val viewModel: PortfolioViewModel,
private val tabType: PortfolioTabType
) : PageKeyedDataSource<Int, Investment>() {

override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, Investment>) {
val offset = 0
viewModel.loadInvestments(tabType, offset, Consumer {
val nextKey = if (it.data.size < params.requestedLoadSize) null else it.data.size
callback.onResult(it.data, offset, it.total, null, nextKey)
})
}

override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Investment>) {
val offset = params.key
viewModel.loadInvestments(tabType, offset, Consumer {
val nextKey = offset + it.data.size
callback.onResult(it.data, nextKey)
})
}

override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Investment>) {

}

class Factory(
val viewModel: PortfolioViewModel,
private val tabType: PortfolioTabType
) : DataSource.Factory<Int, Investment>() {

val sourceLiveData = MutableLiveData<PortfolioListDataSource>()

override fun create() = PortfolioListDataSource(viewModel, tabType)
.also { sourceLiveData.postValue(it) }
}
}

这里我初始化

val pagedListConfig = PagedList.Config.Builder()
.setInitialLoadSizeHint(20)
.setPageSize(20)
.build()

ordersLiveData = LivePagedListBuilder(factory, pagedListConfig).build()

这里我填充适配器

viewModel.ordersLiveData.observe(this, Observer {
adapter.submitList(it)
})

并用

刷新它
// TODO Here I want to fetch new data, but not invalidate current dataset while it is loading
factory.sourceLiveData.value?.invalidate()

如何保留以前的数据并在新数据准备就绪时更新它?

更新:
我想要这样的东西:

if (!refreshing) {
submitList(it)
}

我的意思是在调用 dataSource.invalidate() 时不将空数据集发布到适配器。

我知道上面提到的示例将不起作用,因为一旦提交,数据源就会将更新传递给列表的同一实例,并且它是完全封装的。
此外,我对数据集本身没有影响。

我尝试使用 PagedList.Callback 它可以让我们知道列表何时更新。但同样,没有机会以某种方式影响更新行为。

对于常规适配器,在收到新数据之前,我不会设置或更新它的项目。我想在这里实现类似的目标。

最佳答案

是的,invalidate() 将清除当前数据集。因此,您将进入加载/占位符状态。也无法更新特定页面。比如说,你在第 5 页,你想更新该特定页面中的数据。如果不调用 invalidate() 也是不可能的,这将清除数据集并将 Recyclerview 带到第一页(列表顶部)。

摆脱所有这些问题的唯一方法是在 Room 中引入一个持久层。 https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample#paging-with-database-and-network

根据此处的文档: https://developer.android.com/reference/androidx/paging/DataSource#updating-paged-data

If you have more granular update signals, such as a network API signaling an update to a single item in the list, it's recommended to load data from network into memory. Then present that data to the PagedList via a DataSource that wraps an in-memory snapshot. Each time the in-memory copy changes, invalidate the previous DataSource, and a new one wrapping the new state of the snapshot can be created.

https://developer.android.com/topic/libraries/architecture/paging/data#consider-content-updates

As you construct observable PagedList objects, consider how content updates work. If you're loading data directly from a Room database updates get pushed to your app's UI automatically.

在您的情况下,您始终可以在屏幕恢复时从数据库加载数据,直到从您的 API 获取数据。

关于android - PagedListAdapter 重新加载没有占位符的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com