【问题标题】:How to get data from DataSource.Factory如何从 DataSource.Factory 获取数据
【发布时间】:2019-02-06 19:34:52
【问题描述】:

我必须调用这个方法来获取所有的人。我根本无法修改此方法。

@Query("SELECT * FROM PERSON_TABLE ORDER BY NAME DESC"
abstract fun getElements(): DataSource.Factory<Int, Person>

然后在Activity 我这样称呼它:

override fun onCreate(...)
{
    ...

    val data = dao.getElements()
}

我想获取所有Persons,可能作为一个列表。我该怎么做?

我不明白DataSource.Factory&lt;Int, Person&gt; 的工作原理。

【问题讨论】:

标签: android kotlin android-room android-jetpack


【解决方案1】:

根据docs

通常,您的 UI 代码会观察驻留在应用的 ViewModel 中的 LiveData 对象(或者,如果您使用的是 RxJava2,则为 Flowable 或 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&lt;Int, Person&gt; 对象传递给LivePagedListBuilder,最后你会得到LiveData&lt;PagedList&lt;Person&gt;&gt;,你可以观察到。


之后需要将connectLiveData转成PagedListAdapter,如下代码sn-p所示:

private val adapter = YourDataAdapter()

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

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

【讨论】:

    【解决方案2】:

    当我们想要使用 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.getElementsLiveData().observer(this, Observer{pagedList->
      adaoter.submitList(pagedList)
     })
    

    【讨论】:

      【解决方案3】:

      添加到@Sergey 的答案,您可以使用PagedList&lt;&gt;.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 中当前可用的项目。

      【讨论】:

        猜你喜欢
        • 2020-01-29
        • 2021-02-10
        • 2018-12-25
        • 2023-03-26
        • 2018-02-22
        • 2019-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多