Как реализовать часть разделов с помощью LinearLayoutManager, а часть - с помощью 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 введите описание изображения здесь

Кто-нибудь знает, как этого добиться с помощью литографии?

1 ответ

Решение

Электрический ток 0.11.1-SNAPSHOT версия Litho поддерживает StaggeredGridRecyclerConfiguration что позволяет создавать такой интерфейс. По сути, нам нужно создать экземпляр 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 для каждого настраиваемого представления. Но вы можете проголосовать за эту проблему здесь

Другие вопросы по тегам