ListAdapter не обновляет RecyclerView, если я отправляю тот же список с другим порядком элементов - PullRequest
2 голосов
/ 20 марта 2019

Я использую RecyclerView с ListAdapter (который использует AsyncListDiffer для вычисления и анимации изменений при замене списка).

Проблема заключается в том, что еслиЯ submit() какой-то список, затем переупорядочив этот список, и submit() снова ничего не происходит.

Как заставить ListAdapter оценить этот новый список, даже если он "тот же"(но порядок изменился)?

Новые результаты:

Я проверил исходный код submitList () и в начале есть проверка:

public void submitList(@Nullable final List<T> newList) {
        final int runGeneration = ++this.mMaxScheduledGeneration;
        if (newList != this.mList) {

Я думаю, что это проблема.Но как пройти это?Я имею в виду, наверняка разработчики подумали о предоставлении другого упорядоченного списка?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Эта функция не будет вызвана, потому что ListAdapter не будет рассматривать ее как другой список, так как в ней есть все одинаковые элементы , только изменился порядок.

@Override
public void submitList(@Nullable final List<T> list) {
super.submitList(list != null ? new ArrayList<>(list) : null);
}

Таким образом, чтобы решить эту проблему, вам нужно сначала вызвать эту функцию с помощью null, а затем немедленно вызвать список с измененным заказом.

submitList(null);
submitList(orderChangedList);
1 голос
/ 21 марта 2019

Он побеждает ListAdapter цель автоматического расчета и анимации изменений списка при последовательном вызове этих строк:

submitList(null);
submitList(orderChangedList);

То есть вы только очистили (null) ListAdaptercurrentList и затем представил (.submitList()) новый список.Таким образом, соответствующая анимация в этом случае не будет видна, а будет только обновление всего RecyclerView.

Решение заключается в реализации метода .submitList( List<T> list) внутри ListAdapter следующим образом:

public void submitList(@Nullable List<T> list) {
    mDiffer.submitList(list != null ? new ArrayList<>(list) : null);
}

Таким образом, вы позволяете ListAdapter сохранять свой currentList и «расставлять» его с newList, тем самым вычисляя анимацию, в отличие от «diffing» с null.

Примечание: Однако анимация обновления не произойдет, если, конечно, newList содержит те же элементы в том же порядке, что и originalList.

...