我在应用程序中使用liveData。我做一个数据库查询,它返回存储在数据库中的LiveData<PagedList<Contact>>
个联系人。
我想先修改此实时数据,然后再将其提供给观察者。假设LiveData列表中有十个联系人,我想与另一个列表进行一些比较,并设置LiveData列表中主要的联系人。
完成此操作后,我想将其提供给观察者。
例如-
val allContacts: LiveData<PagedList<Contact>> = getFromDB()
val list: ArrayList<String>() = list of some primary contacts
遍历allContacts
和list
并设置allContacts
中的哪些值与list
中的值匹配。
allContacts
中的哪个值匹配,它们的isPrimary
属性将设置为true。
现在修改allContacts
之后,我想将其提交给观察者,例如:
allContacts.observe(this, Observer(adapter::submitList))
我尝试过LiveData.transform,但是无法正确使用它。有人可以建议我如何使用transform方法或其他方法来实现它。
答案 0 :(得分:0)
您正在寻找的是一种转变。使用Transformations.map()从将在每次首次LiveData更改时运行的函数创建新的LiveData。
例如
val allContacts: LiveData<PagedList<Contact>> = getFromDB()
val contactViewModel = Transformations.map(allContacts, {
// Transform and create new list from old
})
答案 1 :(得分:0)
您的问题根源于您希望“拦截”将由数据库发布到LiveData
对象的更新的事实。不管这是一种好方法,您都可以通过技术上的实现,方法是将DB返回的LiveData
用您自己的LiveData
子类包装。
换句话说。 UI
-观察-> YourLiveData
-观察-> DBLiveData
P.S。我认为一般来说,您可以通过修改数据库查询来解决问题,但这只是我假设您已经在其他一些表中拥有“主要联系人”