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

165 Views Asked by At

I have many different types of views in recycler spec.

@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 -> ...
        }

Everything works fine but at some point I need items to be laid in GridLayoutManager fashion. enter image description here

Does anybody knows how to achieve this with litho?

1

There are 1 best solutions below

0
On BEST ANSWER

The current 0.11.1-SNAPSHOT version of litho supports StaggeredGridRecyclerConfiguration which allows building such UI. Basically, we need to instantiate RecyclerCollectionComponent

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

And if we want an item to occupy full span we need to set isFullSpan when creating render info:

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

Note that ViewRenderInfo is not supported yet, therefore you have to create your own MountSpecs for each custom view. But you can vote for this issue here