我需要在一个不断变化的数组上创建一个Observer(添加元素).
我正在使用Obserable.from(Iterable),但它似乎在创建时创建了ArrayList上的Observable.
每次ArrayList获取添加的新元素时,我都需要通知Observer并执行Action.
底线问题
如果我使用MutableLiveData<List<Article>>,当文章的标题/内容更改,添加了新的文章以及删除了文章时,是否有办法正确通知观察者?
似乎只有在LiveData上设置了一个全新的集合时才有可能发出通知,这似乎会导致UI刷新的效率很低。
假设的例子
假设以下...
我的LiveData类看起来像这样:
public class ArticleViewModel extends ViewModel {
    private final MutableLiveData<List<Article>> mArticles = new MutableLiveData<>();
}
我想使用RecyclerView在列表中显示文章。因此,只要我的Fragment观察到ArticleViewModel的LiveData中的更改,它就会在我的自定义RecyclerView.Adapter类上调用以下方法:
public class ArticleRecyclerViewAdapater extends RecyclerView.Adapter<Article> {
    private final ArrayList<Article> mValues = new ArrayList<>();
    public void resetValues(Collection<Article> articles) {
        mValues.clear();
        mValues.addAll(articles);
        notifyDataSetChanged();
    }
}
最后,我的应用程序将允许用户添加新文章,删除现有文章并更改现有文章的名称(需要在RecyclerView列表中进行更新)。我该怎么做呢?
添加/删除文章
如果您从基础Collection中添加/删除项目,则LiveData构造似乎不会通知观察者。看来您必须调用LiveData#setValue,也许ArticleViewModel需要一个看起来像这样的方法:
public void deleteArticle(int index) {
    final List<Article> articles = mArticles.getValue();
    articles.remove(index);
    mArticles.setValue(articles);
}
那不是真的很低效吗,因为它会触发RecyclerView.Adapter中的完全刷新,而不是仅仅添加/删除单个行?
更换名字
如果您更改基础集合中项目的内容,则LiveData构造似乎不会通知观察者。因此,如果我想更改现有文章的标题并将其反映在RecyclerView中,则我的ArticleViewModel必须修改对象并使用整个集合调用LiveData#setValue。
再次,这不是真的效率不高吗,因为它会触发RecyclerView.Adapter中的完全刷新吗?
MutableList将 a 包装在LiveDataor中的建议方法是什么MutableLiveData,以便可以修改列表并观察它所发生的变化?
我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给我的应用程序中的模型类,并通过将此类包装在或 中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 : …