如何使用LiveData正确更新Android的RecyclerView?

问题描述 投票:7回答:1

底线问题

如果我使用的是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中触发完全刷新吗?

android android-recyclerview android-livedata
1个回答
0
投票

LiveData仅在顶级值已更改的情况下才会向其观察者发出更改的警报。但是,对于复杂的对象,这仅意味着对象引用已更改,而不是对象的某些属性已更改。要观察属性的更改,需要PropertyAwareMutableLiveDataCheck this link how to implement it

© www.soinside.com 2019 - 2024. All rights reserved.