Как избежать requestModelBuild для всех виджетов в recyclerview

У меня есть вид ресайклера с фиксированным числом виджетов по вертикали в определенном порядке. Некоторые из виджетов также содержат табличные данные, поэтому я подумал об использовании в нем вложенного представления ресайклера.

Каждый виджет выполняет http-вызов асинхронно из ViewModel и связывает данные с epoxyController, как я упоминал ниже.

Поскольку requestModelBuild() вызывается для каждого виджета, когда они получают данные через общедоступные сеттеры, например, priceViewData, packageData и т. Д., Откуда вызывается requestModelBuild(). Таким образом, в этом случае каждая привязка виджета происходит независимо от того, каждый раз, когда получены данные для любого из виджетов. Это тоже кажется дорогостоящим, там некоторая аналитика увольняется по мере необходимости для каждой привязки.

Итак, здесь количество запросов аналитики для виджета увеличивается. Пожалуйста, подскажите, можно ли с этим справиться через эпоксидную смолу без ручной обработки.

class ProductDetailsEpoxyController(val view: View?,
                              private val name: String?,
                              private val context: Context?) : 
 AsyncEpoxyController() {

private val args = bundleOf("name" to name)

var priceViewData: IndicativePriceViewData? = emptyPriceViewData()
    set(value) {
        field = value
        requestModelBuild()
    }

var packageData: PackageViewData? = emptyPackageWidgetViewData()
    set(value) {
        field = value
        requestModelBuild()
    }

   ...
   ...



override fun buildModels() {
    buildPriceViewData()
    buildPackageViewData()
    ....
}

private fun buildPriceViewData(){
    priceViewData?.let {
        id("price")
        priceViewDataModel(it)
    }
}

private fun buildPackageViewData(){
    packageViewData?.let {
         id("package")
          packageViewDataModel(it)
    }
}

  ...
  ...

 }

1 ответ

Из Epoxy Wiki:

Адаптер и детали различий После того, как модели построены, Epoxy устанавливает новые модели на поддерживающем адаптере и запускает алгоритм сравнения для вычисления изменений по сравнению с предыдущим списком моделей. Любые изменения элемента сообщаются в RecyclerView, поэтому представления можно удалять, вставлять, перемещать или обновлять по мере необходимости.

По сути, это гарантирует, что не все модели будут обновлены.

Проблема, с которой вы столкнулись, возможно, связана с:

  1. Использование DataBinding
  2. Ваши классы не реализованы equals а также hashCode как хотите.

Проблема с использованием объектов в DataBinding заключается в том, что каждый раз, когда объект обновляется, все поля, которые зависят от объекта, также обновляются, даже если не все изменяются.

Если ваши классы являются обычными классами, а не классами данных, или вы ожидаете другого поведения при выполнении priceData1 == priceData2(например, сравнивая только идентификатор данных), вы должны переопределить эти методы, чтобы Epoxy правильно обнаруживал изменения. Кроме того, вы можете использовать параметр DoNotHash для EpoxyAttribute, чтобы класс не добавлялся в функцию hashCode модели. Больше информации

Другие вопросы по тегам