![](/img/trans.png)
[英]Room Local Unit Test - Query PagedList from DataSource.Factory
[英]How to get data from DataSource.Factory
我必须调用这个方法来获取所有的人。 我根本无法修改此方法。
@Query("SELECT * FROM PERSON_TABLE ORDER BY NAME DESC"
abstract fun getElements(): DataSource.Factory<Int, Person>
然后在一个Activity
我这样称呼它:
override fun onCreate(...)
{
...
val data = dao.getElements()
}
我想得到所有的Person
,可能是一个列表。 我该怎么做呢?
我不明白DataSource.Factory<Int, Person>
是如何工作的。
根据文档:
通常,您的 UI 代码观察驻留在应用程序的 ViewModel 中的 LiveData 对象(或者,如果您使用 RxJava2,则观察 Flowable 或 Observable 对象)。 这个 observable 对象在你的应用列表数据的展示和内容之间形成了联系。
为了创建这些可观察的 PagedList 对象之一,请将 DataSource.Factory 的实例传递给 LivePagedListBuilder 或 RxPagedListBuilder 对象。 DataSource 对象为单个 PagedList 加载页面。 工厂类创建 PagedList 的新实例以响应内容更新,例如数据库表失效和网络刷新。 Room 持久性库可以为您提供 DataSource.Factory 对象,或者您可以构建自己的对象。
示例代码如下:
// The Int type argument corresponds to a PositionalDataSource object.
val data: DataSource.Factory<Int, Person> = dao.getElements()
val dataList: LiveData<PagedList<Person>> = LivePagedListBuilder(data, /* page size */ 20).build()
所以你需要将你的DataSource.Factory<Int, Person>
对象传递给LivePagedListBuilder
,最后你会得到LiveData<PagedList<Person>>
,你可以观察到。
之后,您需要将LiveData
连接到PagedListAdapter
,如以下代码片段所示:
private val adapter = YourDataAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
dataList.observe(this, Observer { adapter.submitList(it) })
}
您可以在此处找到适配器的示例代码。
当我们想使用 android 分页组件进行分页时,我们使用 Datasource。 有很多方法可以实现,
先实现分页库
implementation "android.arch.paging:runtime:2.1.0"
现在最简单的把数据源转换成LiveData>的方法就是这个
fun getElementsLiveData(): LiveData<PagedList<Person>> {
val data = mDao.getElements()
return LivePagedListBuilder(data, 10).build() // 10 is page size
}
您还可以在页面大小上传递配置
fun getElementsLiveData(): LiveData<PagedList<Person>> {
val pagedListConfig = PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setInitialLoadSizeHint(15)
.setPageSize(10)
.build()
val data = mDao.getElements()
return LivePagedListBuilder(data, pagedListConfig).build()
}
现在像这样创建你的寻呼机适配器和视图持有者
class ElementAdapter(
private val clickListener: ClickListener
) : PagedListAdapter<Person, ElementViewHolder>(diffCallback) {
override fun onBindViewHolder(holder: ElementViewHolder, position: Int) {
val person = getItem(position)
with(holder) {
// bind your data here
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ElementViewHolder =
ElementViewHolder(parent)
companion object {
/**
* This diff callback informs the PagedListAdapter how to compute list differences when new
* PagedLists arrive.
*/
private val diffCallback = object : DiffUtil.ItemCallback<Person>() {
override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: News, newItem: News): Boolean =
oldItem.title == newItem.title
}
}
}
之后,在您的活动或片段中,您可以简单地使用 viewmodel 观察数据更改并将您的数据提交给适配器
viewModel.getElementsLiveData().observer(this, Observer{pagedList->
adaoter.submitList(pagedList)
})
添加到@Sergey 的答案中,您可以使用PagedList<>.snapshot()
获取常规列表
// Get the DataSource from the database
val dataSource: DataSource.Factory<Int, Person> = dao.getElements()
// Get the dataSource as LiveData
val data = dataSource.toLiveData(20 /* page size */)
// In UI
vm.data.observer(this, Observer{pagedList->
// To get the pagedList as a regular list -
val dataList = pagedList.snapshot()
})
注意: snapshot()
函数只为您提供 pagedList 中当前可用的项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.