如何从DataSource.Factory获取数据

时间:2019-02-06 19:34:53

标签: android kotlin android-room android-jetpack

我必须调用此方法才能获得所有人员。我根本无法修改此方法。

@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>的工作原理。

3 个答案:

答案 0 :(得分:0)

根据docs

  

通常,您的UI代码会观察一个LiveData对象(或者,如果您使用的是RxJava2,则是Flowable或Observable对象),该对象位于应用程序的ViewModel中。此可观察对象在应用程序列表数据的表示形式与内容之间建立了联系。

     

为了创建这些可观察的PagedList对象之一,请传入   DataSource.Factory的实例传递给LivePagedListBuilder或   RxPagedListBuilder对象。 DataSource对象会加载   单个PagedList。工厂类创建PagedList的新实例   响应内容更新,例如数据库表失效   和网络刷新。房间持久性库可以提供   您可以使用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>>,可以观察到。


之后,您需要connect LiveDataPagedListAdapter,如以下代码片段所示:

private val adapter = YourDataAdapter()

override fun onCreate(savedInstanceState: Bundle?) {
    dataList.observe(this, Observer { adapter.submitList(it) })
}

您可以找到here的适配器示例代码。

答案 1 :(得分:0)

在@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中当前可用的项目。

答案 2 :(得分:0)

当我们想使用android页面组件进行分页时,我们使用数据源。 有很多方法可以实现它,

首先实现分页库

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)
 })