Вид ресайклера эпоксидной смолы без надувания макета
Я использую
Epoxy Recycler View
с
Databinding
. Проблема в том, что на экране не раздувается макет. Я проверил, что список не пуст и цикл работает правильно. Код, который я использую, приведен ниже:
binding.updatesEpoxyRecycler.withModels {
postsList.forEachIndexed() { pos, it ->
updates {
postContent(it)
onPostClick { view ->
when (view?.id) {
R.id.layout_recycler_updates_share -> {
sharePost(pos)
}
R.id.layout_recycler_updates_file_download -> {
context?.showShortToast("File download clicked on pos = $pos")
}
R.id.layout_recycler_updates_bookmark -> {
Timber.d("posts active observer in on click of button = ${viewModel.posts.hasActiveObservers()}")
handleBookmarkClick(postsList[pos])
}
}
}
}
}
}
Я попытался разобраться в проблеме, но не смог ее найти.
1 ответ
Решение
В коде есть две проблемы:
- Вы просто звоните своему
update
модель, но не вернув ее. - При использовании
Epoxy
нам нужно установить идентификатор, потому что Epoxy предоставляетDiffUtil
прямо из коробки, поэтому нам нужно предоставить идентификатор для каждого элемента. Вы можете использовать позицию или что-то еще, если у вас есть, но убедитесь, что она должна быть уникальной.
Итак, правильный код ниже:
binding.updatesEpoxyRecycler.withModels {
postsList.forEachIndexed() { pos, it ->
return@forEachIndexed updates { // here added return
id(pos) // set id for each item
postContent(it)
onPostClick { view ->
when (view?.id) {
R.id.layout_recycler_updates_share -> {
sharePost(pos)
}
R.id.layout_recycler_updates_file_download -> {
context?.showShortToast("File download clicked on pos = $pos")
}
R.id.layout_recycler_updates_bookmark -> {
Timber.d("posts active observer in on click of button = ${viewModel.posts.hasActiveObservers()}")
handleBookmarkClick(postsList[pos])
}
}
}
}
}
}
В приведенном выше коде вы можете видеть, что я вернул модель и после этого установил идентификатор для каждого элемента. Для вашего удобства я прокомментировал это в коде.
Не стесняйтесь спрашивать, если что-то неясно