底线问题
如果我使用的是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中触发完全刷新吗?
LiveData仅在顶级值已更改的情况下才会向其观察者发出更改的警报。但是,对于复杂的对象,这仅意味着对象引用已更改,而不是对象的某些属性已更改。要观察属性的更改,需要PropertyAwareMutableLiveDataCheck this link how to implement it