Что именно происходит под капотом после отправки DiffResult в адаптер RecyclerView

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я просматривал документы RecyclerView по DiffUtil.

Я понял большую часть деталей, кроме одной вещи. В нем говорится, что после вычисления разницы вы делаете:

 List oldList = mAdapter.getData();
DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
mAdapter.setData(newList);
result.dispatchUpdatesTo(mAdapter);
  

и говорит:

вы можете поменять список на новый, а затем отправить все обновления в RecyclerView.

У меня есть одно сомнение. Что именно здесь происходит под капотом?

Если я уже отправляю обновления адаптеру, не получит ли он новые данные сам по себе после использования этих обновлений? Почему мне нужно явно указывать новые данные?

Ответ, который подробно объясняет, как эти обновления отправляются и используются Adpater, был бы высоко оценен.

Спасибо.

Ответ №1:

Метод dispatchUpdatesTo(RecyclerView.Adapter) на самом деле является простой оболочкой dispatchUpdatesTo(ListUpdateCallback updateCallback) .

Я думаю, что исходный код говорит сам за себя:

 public void dispatchUpdatesTo(final RecyclerView.Adapter adapter) {
      dispatchUpdatesTo(new ListUpdateCallback() {
          @Override
          public void onInserted(int position, int count) {
              adapter.notifyItemRangeInserted(position, count);
          }
          @Override
          public void onRemoved(int position, int count) {
              adapter.notifyItemRangeRemoved(position, count);
          }
          @Override
          public void onMoved(int fromPosition, int toPosition) {
              adapter.notifyItemMoved(fromPosition, toPosition);
          }
          @Override
          public void onChanged(int position, int count, Object payload) {
              adapter.notifyItemRangeChanged(position, count, payload);
          }
      });
}
  

Вы можете видеть, что единственной целью обратных вызовов является уведомление об обновлениях.

Вычисление diff — это операция, доступная только для чтения, которая оставляет оба списка неизменными. Вот почему вам нужно вручную обновить список внутри вашего адаптера.