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

前端之家收集整理的这篇文章主要介绍了android – 初始加载后更新PagedListAdapter以显示最新的网络数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在利用新的Paging库从其他API加载分页数据,但是我无法理解如何在Room中缓存后继续加载新数据.目前,我有一个PagedListAdapter,它通过使用边界回调来加载来自API的项目,然后存储在本地数据库(Room)中,这些数据通过可流动的方式发送到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)

解决方法

使用这种技术(数据库和休息)的重点是缓存数据并防止再次加载它们.
但是,如果您的数据不是静态的,则可能会更改或无效.
你可以有两种方法

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

2 – 将数据库中的字段设置为“过期”日期或类似内容.继续检查boundaryCallback中onItemAtFrontLoaded上的字段,如果它们已过期,您可以从Web服务再次使其无效并再次获取它.

猜你在找的Android相关文章