簡體   English   中英

如何避免recyclerview中每個小部件的requestModelBuild

[英]How to avoid requestModelBuild for every widgets in a recyclerview

我有一個按特定順序垂直固定數量小部件的回收站視圖。 一些小部件還包含表格數據,因此我考慮在其中也使用嵌套的回收器視圖。

每個小部件都會使 http 從 ViewModel 異步調用,並將數據綁定到環氧樹脂控制器,如下所述。

由於每個小部件都會調用 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)
    }
}

  ...
  ...

 }

來自環氧樹脂的維基

適配器和差異詳細信息 構建模型后,Epoxy 會在支持適配器上設置新模型並運行差異算法來計算針對先前 model 列表的更改。 任何項目更改都會通知 RecyclerView,以便可以根據需要刪除、插入、移動或更新視圖。

所以基本上,這確保了並非所有模型都會更新。

您面臨的問題可能與以下方面有關:

  1. 使用數據綁定
  2. 你的類沒有按照你想要的方式實現equalshashCode

在 DataBinding 中使用對象的問題在於,每次更新 object 時,所有依賴於 object 的字段也會更新,即使不是全部更改。

如果您的類是普通類而不是數據類,或者您在執行priceData1 == priceData2時期望不同的行為(例如,僅比較數據的 id),您應該重寫此方法,以便 Epoxy 正確檢測更改。 此外,您可以為 EpoxyAttribute 使用DoNotHash選項,因此 class 不會添加到模型的 hashCode function 中。 更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM