kotlin - 在 LiveData 或 MutableLiveData 中包装 MutableList

标签 kotlin android-livedata mutablelivedata mutablelist

MutableList 包装在 LiveDataMutableLiveData 中的推荐方法是什么,以便可以修改列表并观察它的变化经历 ?

我在 Room 中有一些相当短的表(<20 项)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作查询其他更大表的过滤器。我的想法是将 MutableList 分配给我的应用程序中的模型类,并通过将此类包装在 MutableLiveDataLiveData 中使其可观察。然后通过更新这些选择中的项目,我可以触发对大表的必要查询。

目前我的代码具有以下结构,我已在我的问题中将其精简为我认为相关的内容。最终我想在更复杂的查询中使用多个 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>>
}

KeyValue 类只是 KeyEntityValueEntity 的 POJO,并简单地指定相同的字段.

我应该为此目的使用 MutableLiveData 还是 LiveData?如果是这样,应该如何实现 keyset ?也许有更规范的方式来这样做?

最佳答案

LiveData 与 MutableLiveData

我不确定我是否必须包装我的 MutableList作为LiveData<MutablList<POJO>>MutableLiveData<MutableList<POJO>> , 其中POJO是数据库实体或代理一个或多个数据库实体的数据类的实例。 Sneh Pandaya简洁地解释了两个类之间的区别。我也不确定如何实例化它们。以下创建实例但 valuekeyset初始化为 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
  ... }
... }

MutableLiveData 中有细微差别| ,它没有正式封装数据。也就是说,当它包装一个项目时,它不会公开包装的项目方法,因为它会在修改包装的项目时自己发出通知。它仅跟踪包装的元素何时被换出(参见 Gznlt )。 Samnang CHEA提供了一个很好的方法来支持这一点。

位置,位置,位置,...

我不确定在哪里正式放置 keyset属性。 Android documentation提供以下信息;事实证明我走在了正确的道路上。

Update LiveData objects

LiveData has no publicly available methods to update the stored data. The MutableLiveData class exposes the setValue(T) and postValue(T) methods publicly and you must use these if you need to edit the value stored in a LiveData object. Usually MutableLiveData is used in the ViewModel and then the ViewModel only exposes immutable LiveData objects to the observers.

查询

我还没有解决的是如何触发 values 的更新.

关于kotlin - 在 LiveData 或 MutableLiveData 中包装 MutableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421708/

相关文章:

kotlin - 在同一ViewModel中对LiveData更改使用react

android - 如何在 Android 中以正确的方式观察多个 observe 的 livedata?

android - Dialog Fragment 无法将事件回传给 Android 中的调用 Fragment?

android - 如何正确组合两个实时数据对象

android - 带加号的Kotlin多行字符串声明

java - Dagger 组件从应用程序类获取?

android - Viewmodel 观察 LiveData - 如何?

android - 当应用程序来自后台时总是触发观察者

android - 在不使用 Room 的情况下使用 LiveData 和 ViewModel

Android MediatorLiveData源订阅不触发