初始加载后更新 PagedListAdapter 以显示最新的网络数据

问题描述 投票:0回答:1

我正在利用新的分页库从 REST API 加载分页数据,但我无法理解如何在缓存到 Room 中后继续加载新数据。目前,我有一个 PagedListAdapter,它通过使用边界回调从 API 加载项目进行更新,然后将其存储在本地数据库(房间)中,并通过 flowable 发送到 UI。

来自 BoundaryCallback 的 onZeroItemsLoaded 和 onItemAtEndLoaded 调用均按预期运行,但仅适用于初始加载。一旦数据被检索一次并存储在缓存(Room)中,我将永远不会从网络服务获取新数据——缓存中已经有数据并且不会触发边界回调。

如何使用分页库将项目标记为过时,以便每次应用程序打开时我的数据都是最新的?

ItemCallback.kt:

class ItemBoundaryCallback : PagedList.BoundaryCallback<Item>() { override fun onZeroItemsLoaded() { itemsFromNetwork(0) } override fun onItemAtEndLoaded(itemAtEnd: Item) { itemsFromNetwork(itemAtEnd.rank) } }

ItemRepository.kt:

fun items(): Flowable<PagedList<Item>> { return RxPagedListBuilder(database.itemDao().items(), pageSize) .setBoundaryCallback(boundaryCallback) .buildFlowable(BackpressureStrategy.LATEST) }

ItemDao.kt

@Query("SELECT * FROM item ORDER BY rank ASC") fun items(): DataSource.Factory<Int, Item>

ItemAdapter.kt

class ItemAdapter() : PagedListAdapter<Item, ItemViewHolder>(diffCallback) { companion object { private val diffCallback = object : DiffUtil.ItemCallback<Item>() { override fun areItemsTheSame(old: Item, new: Item): Boolean = old.id == new.id override fun areContentsTheSame(old: Item, new: Item): Boolean = old == new } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { return ItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.r_item, parent, false)) } override fun onBindViewHolder(viewHolder: ItemViewHolder, position: Int) { viewHolder.bind(getItem(position), clickListener) } }

ItemFragment.kt

override fun onStart() { super.onStart() itemRepository.items() .subscribe(itemAdapter::submitList) .addTo(disposables)
    
android kotlin pagination android-paging-library
1个回答
4
投票
使用此技术(数据库和其余)的全部目的是缓存数据并防止再次加载它们。 但如果您的数据不是静态的,它可能会被更改或失效。 你可以有两种方法:

1 - 关闭应用程序后(或启动应用程序时删除数据库中的每条记录。销毁回调不可行),在这种情况下,您将在下次启动后获得新数据。

2 - 在数据库中创建一个字段作为“到期”日期或类似的日期。继续检查

onItemAtFrontLoaded

boundaryCallback
 上的字段,如果它们已过期,您可以使其失效并从网络服务中再次获取。

© www.soinside.com 2019 - 2024. All rights reserved.