1

我已经开始学习如何在我的项目中使用 Epoxy。我通过运行示例项目来学习这个库。一切都很好,直到我深入研究网格跨度设置。我发现自己对它的网格系统感到困惑。

在此处输入图像描述

正如您在示例应用程序中看到的,ViewHolders 可以分为 3 个部分。HeaderViewModel_这些部分可以特别在模型中表示,例如ButtonBindingModel_CarouselModelGroup

而init RecyclerView的代码如下:

EpoxyRecyclerView recyclerView = (EpoxyRecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));

根据官方文档:

如果使用 GridLayoutManager,这将自动将跨度计数与 EpoxyController 同步。

我发现HeaderViewModel_CarouselModelGroup正确同步了跨度,但ButtonBindingModel_不是。我一直在示例代码中搜索“span”或“grid”这个词,我只是想不通为什么ButtonBindingModel_可以将其 span 设置为 1。

如果我将 RecyclerView 的跨度设置从 2 更改为 3:

EpoxyRecyclerView recyclerView = (EpoxyRecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));

在此处输入图像描述

HeaderViewModel_并且CarouselModelGroup仍然保持同步整个跨度,但跨度ButtonBindingModel_仍然是 1。

我想知道是否有一种方法可以将跨度设置ButtonBindingModel_为全跨度,以及设置HeaderViewModel_CarouselModelGroup特定跨度的方法,无论是通过代码(以编程方式)还是通过布局。请帮我解决这个问题,我很感激。

4

1 回答 1

6

我们使用的一件事是使用spanSizeOverride. 我们有几个不同的模型,我们希望跨度为 2 vs 1,因此我们在它们上设置了覆盖。

gridLayoutManager.spanSizeLookup = ourController.spanSizeLookup
...

collectionDescription {
  id(DESCRIPTION_ID)
  description(data.description ?: "")
  spanSizeOverride { _, _, _ -> 2 }
}
data.productTemplates?.forEachIndexed { index, product ->
  collectionProduct {
    id("$PRODUCT_ID ${product.slug} $index")
    product(product)
    listener(listener)
  }
}
于 2019-09-17T22:56:16.077 回答