繁体   English   中英

如何从 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM