将MutableList
包裹在LiveData
或MutableLiveData
中的推荐方法是什么,以便人们可以修改列表并观察其经历的变化?
我在会议室中有一些很短的表(<20个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他较大表查询的过滤器。我的想法是将MutableList
分配给应用程序中的模型类,并通过将此类包装在MutableLiveData
或LiveData
中使其可观察。然后,通过更新这些选择中的项目,我可以在大表上触发必要的查询。
目前我的代码具有以下结构,在我的问题中已将其简化为我认为相关的内容。最终,我想在更复杂的查询中使用多个keyset
。我的简化模型文件如下,
class Model(application : Application) : AndroidViewModel(application)
{
val keys : LiveData<List<Key>>
val keyset : LiveData<MutableList<Key>>
val values : LiveData<List<Value>>
init {
keys = repository.keys
values = repository.values
keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
}
}
它依赖于存储库
class Repository(private val queryset : QuerySet)
{
val keys : LiveData<List<Key>> = queryset.getKeys()
val values : LiveData<List<Value>> = queryset.getValues()
}
依赖查询集
@Dao
class QuerySet(application : Application) : AndroidViewModel(application)
{
@Query("SELECT * FROM KeyEntity")
fun getKeys() : LiveData<list<Key>>
@Query("SELECT * FROM ValueEntity WHERE key in (:keys)")
fun getValues(keys : MutableList<Key>) : LiveData<list<Value>>
}
Key
和Value
类只是KeyEntity
和ValueEntity
的POJO,并且仅指定相同的字段。
我应该为此目的使用MutableLiveData
还是LiveData
吗?如果是这样,应该如何实现keyset
?也许有更规范的方法可以这样做?
答案 0 :(得分:0)
我不确定是否必须将MutableList
包装为LiveData<MutablList<POJO>>
或MutableLiveData<MutableList<POJO>>
,其中POJO
是数据库实体或数据类的实例代理一个或多个数据库实体。 Sneh Pandaya简要解释了这两个类之间的区别。我也不确定如何实例化它们。以下创建了实例,但是value
的{{1}}被初始化为keyset
,并且必须为null
设置初始值。
MutableLiveData
class Model(application : Application) : AndroidViewModel(application)
{ ...
val keyset : LiveData<MutableList<Key>>
init { ...
keyset = MutableLiveData<MutableList<Key>>() // Initialized as null
keyset.value = mutableListOf<Key>() // Assign an empty list
... }
... }
中有一个细微差别,它没有正式封装数据。那就是当它包装一个项目时,它不公开包装项目的方法,因为当包装项目被修改时,它自身会发出通知。它仅跟踪包装物品何时被换出(请参见Gznlt)。 Samnang CHEA提供了一种支持此功能的好方法。
我不确定MutableLiveData
属性的正式放置位置。 Android documentation提供以下信息;事实证明我在正确的道路上。
更新LiveData对象
LiveData没有公开可用的方法来更新存储的数据。 MutableLiveData类公开公开setValue(T)和postValue(T)方法,如果需要编辑存储在LiveData对象中的值,则必须使用它们。 通常在ViewModel中使用MutableLiveData,然后ViewModel仅向观察者公开不可变的LiveData对象。
我尚未解决的问题是如何触发keyset
的更新。