Как правильно обновить Android RecyclerView с помощью LiveData? - PullRequest
0 голосов
/ 31 мая 2018

Суть вопроса

Если я использую 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?

...