RecyclerView прокрутка вверх с AsyncListDiffer не работает - PullRequest
2 голосов
/ 20 марта 2019

Я использую RecyclerView с AsyncListDiffer (вычисляет и анимирует различия между старыми и новыми элементами, все в фоновом потоке).

У меня есть кнопка для сортировки списка. После того, как я отсортировал и переустановил его на RecyclerView, используя mDiffer.submitList(items);, я также позвонил recyclerView.scrollToPosition(0) или (smoothScrollToPosition(0)), но это не имеет никакого эффекта.

Я думаю, что такое поведение ожидается, поскольку AsyncListDiffer, вероятно, все еще вычисляет различия во время вызова scrollToPosition(0), поэтому оно не имеет никакого эффекта. Кроме того, по умолчанию AsyncListDiffer не выполняет прокрутку вверх, но вместо этого поддерживает RecyclerView в том же состоянии.

Но как мне сказать RecyclerView прокрутить вверх после того, как AsyncListDiffer завершит работу и обновит его?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Я обеспокоен тем, что, хотя .submitList(null), возможно, сработало для вас, оно только обновило весь 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.

1 голос
/ 20 марта 2019

Здесь ответили:

https://stackoverflow.com/a/55264063/1181261

Как правило, если вы отправите один и тот же список в другом порядке, он будет проигнорирован. Итак, сначала вам нужно submit(null), а затем отправить свой переупорядоченный список.

...