在LiveData或MutableLiveData中包装MutableList

时间:2018-11-21 23:08:21

标签: kotlin android-livedata mutablelivedata mutablelist

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

我在会议室中有一些很短的表(<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?也许有更规范的方法可以这样做?

1 个答案:

答案 0 :(得分:0)

LiveData与MutableLiveData

我不确定是否必须将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的更新。