Что именно происходит под капотом после отправки DiffResult в RecyclerView Adapter - PullRequest
0 голосов
/ 12 апреля 2019

Я просматривал DiffUtil от RecyclerView docs .

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

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

и говорит:

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

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2019

Метод 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 - это операция только для чтения, которая оставляет оба списка без изменений. Вот почему вам нужно вручную обновить список внутри вашего адаптера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...