【问题标题】:How to avoid requestModelBuild for every widgets in a recyclerview如何避免recyclerview中每个小部件的requestModelBuild
【发布时间】:2020-04-14 14:02:38
【问题描述】:

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

每个小部件都会从 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)
    }
}

  ...
  ...

 }

【问题讨论】:

    标签: android epoxy epoxy-modelview


    【解决方案1】:

    来自Epoxy's Wiki

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

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

    您面临的问题可能与:

    1. 使用数据绑定
    2. equalshashCode 的类未按您希望的方式实现。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2019-11-11
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      相关资源
      最近更新 更多