Android RecyclerView DiffUtil.Callback: areContentsTheSame () и getChangePayload (), дающие различные результаты сравнения - PullRequest
0 голосов
/ 29 марта 2020

В DiffUtil.Callback есть две функции, которые нужно переопределить:

areContentsTheSame(int oldItemPosition, int newItemPosition)

getChangePayload(int oldItemPosition, int newItemPosition)

Я знаю прежние проверки, изменилось ли содержимое, я бы хотел просто сравнить, если это один и тот же экземпляр, напрямую используя '==', потому что я верю, что мой предмет будет новым экземпляром, когда он будет обновлен. Но то же сравнение дает другой результат в последней функции. Вот код:

public class MyDiffUtilCallback extends DiffUtil.Callback {
  List<App> mNewList;
  List<App> mOldList;

  public MyDiffUtilCallback(List<App> newList, List<App> oldList) {
    mNewList = newList;
    mOldList = oldList;
  }

  @Override
  public int getOldListSize() {
    return mOldList.size();
  }

  @Override
  public int getNewListSize() {
    return mNewList.size();
  }

  @Override
  public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
    return mNewList.get(newItemPosition).id == mOldList.get(oldItemPosition).id;
  }

  @Override
  public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
    return mNewList.get(newItemPosition) == mOldList.get(oldItemPosition);
    // This always returns false correctly whenever the item gets an update, it's working as expected
  }

  @Nullable
  @Override
  public Object getChangePayload(int oldItemPosition, int newItemPosition) {
    if (mNewList.get(newItemPosition) == mOldList.get(oldItemPosition)) {
      return null; // But this is always being executed
    }
    return mNewList.get(newItemPosition).data; // This is never executed, why?
  }
}

Я не понимаю, почему одно и то же сравнение старого и нового элементов дает разные результаты, суперкласс изменяет список или что-то еще?

1 Ответ

0 голосов
/ 29 марта 2020

С Android определение :

Когда areItemsTheSame (int, int) возвращает true для двух элементов, а areContentsTheSame (int, int) возвращает false для них, вызовы DiffUtil этот метод, чтобы получить полезную информацию об изменении.

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

...