0

我在我的应用程序中使用 liveData。我做了一个数据库查询,它返回一个LiveData<PagedList<Contact>>存储在数据库中的联系人。

我想在将其提供给观察者之前修改此实时数据。假设 LiveData 列表中有十个联系人,我想与另一个列表进行一些比较,并设置 LiveData 列表中的主要联系人。

完成此操作后,我想将其提供给观察者。

例如 -

val allContacts: LiveData<PagedList<Contact>> = getFromDB()

val list: ArrayList<String>() = list of some primary contacts

遍历allContactsandlist并设置 中的哪些值allContacts与 中的值匹配list。无论哪个值allContacts匹配,它们的isPrimary属性都将设置为 true。

现在修改后allContacts,我想将其提交给观察者,例如:

allContacts.observe(this, Observer(adapter::submitList))

我尝试了 LiveData.transform,但无法正确使用它。谁能建议我如何使用转换方法或其他方式来实现它。

4

2 回答 2

0

您的问题源于您希望“拦截”LiveData数据库将发布到对象的更新。无论这是否是一个好方法,您都可以LiveData通过使用您自己的LiveData.

换句话说。UI--观察--> --YourLiveData观察-->DBLiveData

PS我认为一般来说你可以通过修改你的数据库查询来解决你的问题,但这只是我假设你已经在其他一些表中有“主要联系人”

于 2018-08-23T11:22:25.440 回答
0

你正在寻找的是一个转换。使用Transformations.map()从每次第一个 LiveData 更改时运行的函数创建一个新的 LiveData。

例如

val allContacts: LiveData<PagedList<Contact>> = getFromDB()
val contactViewModel = Transformations.map(allContacts, {
    // Transform and create new list from old
})
于 2018-08-23T09:59:36.890 回答