如何使用LinearLayoutManager实现部分部分并使用GridLayoutManager部分?

时间:2018-02-06 21:39:58

标签: android litho facebook-litho

我在回收商规范中有许多不同类型的观点。

@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方式放置项目。 enter image description here

有人知道如何用litho实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

当前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尚不支持,因此您必须为每个自定义视图创建自己的MountSpec。但您可以投票支持此问题here