ListAdapter submitList () - Как перейти к началу - PullRequest
0 голосов
/ 11 ноября 2018

У меня проблема с RecyclerView и ListAdapter.

Через API я получаю элементы в возрастающем порядке от старых к новым.

Затем мой список обновляется путем вызова метода submitList (items).

Однако, поскольку все является асинхронным, после получения первого элемента RecyclerView остается на позиции первого полученного и показанного элемента. Поскольку в классе ListAdapter нет обратного вызова после завершения метода submitList (), я не могу найти способ прокрутки после обновления одного из добавленных новых элементов.

Есть ли способ перехвата, когда ListAdapter был обновлен?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Не относится к ListAdapter, но, тем не менее, он должен работать:

Просто используйте adapter.registerAdapterDataObserver(RecyclerView.AdapterDataObserver) и переопределите соответствующий метод onItemXXX, чтобы ваш RecyclerView прокрутился до любой позиции.

Как пример:

    adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            (recycler_view.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(positionStart, 0)
        }
    })
0 голосов
/ 08 марта 2019

метод для переопределения называется:

public void onCurrentListChanged(List<T> previousList, List<T> currentList)

как документация читает:

Вызывается при обновлении текущего List.


встроенная документация ListAdapter гласит:

Этот класс является удобной оболочкой AsyncListDiffer, которая реализует общее поведение адаптера по умолчанию для доступа к элементам и их подсчета.

и позже это читает:

Опытным пользователям, которые хотят больше контролировать поведение адаптера или предоставить конкретный базовый класс, следует обратиться к AsyncListDiffer, который обеспечивает настраиваемое отображение событий diff в позиции адаптера.

это означает, что вам нужно расширить обычный RecyclerView.Adapter в сочетании с пользовательской реализацией AsyncListDiffer; а не ListAdapter (это просто удобная оболочка с заявленными базовыми функциями).

вы можете использовать класс ListAdapter в качестве шаблона для этого (это не расширение, это ключ), но полученный класс можно затем расширить и использовать повторно. иначе нет возможности получить контроль над желаемым обратным вызовом.

...