Суть вопроса
Если я использую MutableLiveData<List<Article>>
, есть ли способ надлежащим образом уведомить наблюдателей, когда название / содержание статьи изменилось, новая статья имеетбыла добавлена, а статья удалена?
Кажется, уведомления возможны только тогда, когда в LiveData установлена совершенно новая коллекция, что может привести к действительно неэффективному обновлению пользовательского интерфейса.
Гипотетический пример
Предположим, что следующее ...
Мой класс LiveData выглядит примерно так:
public class ArticleViewModel extends ViewModel {
private final MutableLiveData<List<Article>> mArticles = new MutableLiveData<>();
}
Я хочу отобразитьСтатьи в списке с помощью RecyclerView.Поэтому каждый раз, когда мой фрагмент наблюдает изменение в LiveData ArticleViewModel, он вызывает следующий метод для моего пользовательского класса 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).Как я могу сделать это правильно?
Добавить / удалить статью
Кажется, конструкция 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?