Как прокрутить RecyclerView наверх после получения новых данных из сети; Я использую ListAdapter, DiffUtil - PullRequest
0 голосов
/ 21 января 2020

Я использую ListAdapter для обновления RecyclerView.

Мой адаптер выглядит как

class MyListAdapter<T, VH : ViewHolder>() :
        ListAdapter<T, VH>(MyDiffUtilItemCallback()) {
...
...
Adapter code
...
...


class MyDiffUtilItemCallback : DiffUtil.ItemCallback<Product>() {

  override fun areItemsTheSame(
    oldItem: Product?,
    newItem: Product?
  ): Boolean {
    if (oldItem != null && newItem != null) {
      return oldItem.productId == newItem.productId
    }
    return false
  }

  override fun areContentsTheSame(
    oldItem: Product?,
    newItem: Product?
  ): Boolean {
    if (oldItem != null && newItem != null) {
      return oldItem.productId == newItem.productId && 
                 oldItem.name== newItem.name && oldItem.weight == newItem.weight
    }
    return false
  }
}
}

Я использую поиск в Google, где пользователь может ввести поисковый запрос и когда пользователь делает паузу Для этого запроса вызывается API, и RecyclerView обновляется с результатом. Теперь, если пользователь снова добавляет запрос, данные извлекаются и добавляются в RecyclerView. Здесь я хочу RecyclerView прокрутить до верхней позиции.

Следующий код не работает для меня:

productAdapter.submitList(productList)
rvBillingProduct.smoothScrollToPosition(0)

Поскольку вычисляется разница в фоновом потоке rvBillingProduct.smoothScrollToPosition(0) выполняется раньше данные добавляются в список.

Я не уверен, как получить обратный вызов, когда вычисление результата DiffUtils завершено, чтобы я мог прокрутить RecyclerView

1 Ответ

0 голосов
/ 21 января 2020

ListAdapter не предоставляет методов, позволяющих узнать, когда diff завершил вычисления. Вместо этого вы можете использовать PagedListAdapter и использовать submitList(myList, callback) или переопределить onCurrentListChanged(...) метод в адаптере:

class MyListAdapter<T, VH : ViewHolder>() :
        PagedListAdapter<T, VH>(MyDiffUtilItemCallback()) {

    ...

    override fun onCurrentListChanged(previousList: PagedList<T>, currentList: PagedList<T>) {
         // Called when the current PagedList is updated.
    }
}
...