如何用 LinearLayoutManager 实现部分部分,用 GridLayoutManager 实现部分?

How to implement part of sections with LinearLayoutManager and part with GridLayoutManager?

我对回收商规范有很多不同类型的看法。

@LayoutSpec
object AdPageSpec {
    @OnCreateLayout
    fun onCreateLayout(c: ComponentContext, @Prop model: List<AdPageItem>): ComponentLayout {
        return RecyclerCollectionComponent.create(c)
                .disablePTR(true)
                .section(
                        DataDiffSection.create<AdPageItem>(SectionContext(c))
                                .data(model)
                                .renderEventHandler(AdPage.onRender(c))
                                .build()
                )
                .buildWithLayout()
    }

    @OnEvent(RenderEvent::class)
    fun onRender(c: ComponentContext, @FromEvent model: AdPageItem): RenderInfo {
        when (model) {
            is TopDetailsItem -> ...
            is DescrItem -> ...
            is ParamItem -> ...
            is GridItem -> ...
        }

一切正常,但有时我需要以 GridLayoutManager 的方式放置项目。

有人知道如何用光刻实现这个吗?

当前 0.11.1-SNAPSHOT 版本的 litho 支持 StaggeredGridRecyclerConfiguration,允许构建这样的 UI。 基本上,我们需要实例化 RecyclerCollectionComponent

RecyclerCollectionComponent.create(c)
                .recyclerConfiguration(
                        StaggeredGridRecyclerConfiguration<SectionBinderTarget>(3)
                )
                .section(...)
                .build()

如果我们想让一个项目占据整个跨度,我们需要在创建渲染信息时设置isFullSpan

 @OnEvent(RenderEvent::class)
    fun onRender(c: SectionContext,
    ): RenderInfo {
        return when (model) {
            is ImagesItem -> ComponentRenderInfo.create()
                        .isFullSpan(true)
                        .component(...)
                        .build()
    }

请注意 ViewRenderInfo 尚不受支持,因此您必须为每个自定义视图创建自己的 MountSpecs。但是你可以为这个问题投票here