【问题标题】:Wrapping MutableList in either LiveData or MutableLiveData在 LiveData 或 MutableLiveData 中包装 MutableList
【发布时间】:2018-11-21 23:08:21
【问题描述】:

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

我在 Room 中有一些相当短的表(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,并且只需指定相同的字段。

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

【问题讨论】:

    标签: kotlin android-livedata mutablelivedata mutablelist


    【解决方案1】:

    LiveData 与 MutableLiveData

    我不确定是否必须将MutableList 包装为LiveData&lt;MutablList&lt;POJO&gt;&gt;MutableLiveData&lt;MutableList&lt;POJO&gt;&gt;,其中POJO 是数据库实体或代理一个或多个数据库实体的数据类的实例。 Sneh Pandaya 简洁地解释了这两个类之间的区别。我也不确定如何实例化它们。以下创建实例,但keysetvalue 被初始化为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 提供以下信息;事实证明我走的是正确的道路。

    更新 LiveData 对象

    LiveData 没有公开可用的方法来更新存储的数据。 MutableLiveData 类公开了 setValue(T) 和 postValue(T) 方法,如果您需要编辑存储在 LiveData 对象中的值,则必须使用这些方法。 通常在 ViewModel 中使用 MutableLiveData,然后 ViewModel 只向观察者公开不可变的 LiveData 对象。

    查询

    我还没有弄清楚如何触发values的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多