Я использую 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