0

我有一个按特定顺序垂直固定数量小部件的回收站视图。一些小部件还包含表格数据,因此我考虑在其中也使用嵌套的回收器视图。

每个小部件都会从 ViewModel 异步调用 http 并将数据绑定到环氧树脂控制器,如下所述。

由于每个小部件都会调用 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)
    }
}

  ...
  ...

 }
4

1 回答 1

1

来自环氧树脂的维基

适配器和差异细节一旦模型被建立,Epoxy 就会在支持适配器上设置新模型,并运行一个差异算法来计算对先前模型列表的更改。任何项目更改都会通知 RecyclerView,以便可以根据需要删除、插入、移动或更新视图。

所以基本上,这确保了并非所有模型都会更新。

您面临的问题可能与以下方面有关:

  1. 使用数据绑定
  2. 您的课程没有按照您想要的方式equals实现。hashCode

在 DataBinding 中使用对象的问题在于,每次更新对象时,依赖于对象的所有字段也会更新,即使不是全部更改。

如果您的类是普通类而不是数据类,或者您在执行时期望不同的行为priceData1 == priceData2(例如,仅比较数据的 id),您应该重写此方法,以便 Epoxy 正确检测更改。此外,您可以为 EpoxyAttribute 使用DoNotHash选项,这样该类就不会添加到模型的 hashCode 函数中。更多信息

于 2020-06-30T04:59:08.697 回答