返回

Compose HorizontalPager实现二级联动效果

Android

Compose HorizontalPager 实现二级联动效果

概要

二级联动是一种常见的交互模式,允许用户在两个滚动菜单中选择项目,一个菜单展示父项,另一个菜单展示子项。本文将展示如何使用 Jetpack Compose 的 HorizontalPager 组件实现二级联动。

优点

  • 简化的 UI 设计
  • 提高性能
  • 提供一致的体验

实现步骤

1. 布局

在布局文件中,添加 HorizontalPagerScrollableTabRow 组件:

<HorizontalPager
    modifier="..." />

<ScrollableTabRow
    modifier="..." />

2. ViewModel

在 ViewModel 中,创建两个可观察列表,一个用于父项,另一个用于子项:

class MyViewModel : ViewModel() {
    val parentItems = ObservableList<ParentItem>()
    val childItems = ObservableMap<ParentItem, List<ChildItem>>()
}

3. Compose 函数

在 Compose 函数中,使用 HorizontalPagerScrollableTabRow 组件显示父项和子项:

@Composable
fun MyContent(viewModel: MyViewModel) {
    HorizontalPager(count = viewModel.parentItems.size, ...) { page ->
        // 显示父项的内容
    }

    ScrollableTabRow(...) {
        // 显示子项的内容
    }
}

4. 选择事件

当用户选择一个父项时,更新子项列表:

Tab(onClick = {
    viewModel.updateChildItems(parentItem)
})

示例代码

@Composable
fun HorizontalPagerExample() {
    val viewModel = HorizontalPagerViewModel()

    HorizontalPager(count = viewModel.parentItems.size, ...) { page ->
        val parentItem = viewModel.parentItems[page]

        Column(...) {
            Text(...)
            ScrollableTabRow(...) {
                viewModel.childItems[parentItem].forEachIndexed { index, childItem ->
                    Tab(...) {
                        viewModel.updateChildIndex(parentItem, index)
                    }
                }
            }
            Text(...)
        }
    }
}

结论

使用 HorizontalPager 实现二级联动效果是一种简单而强大的方法。它可以创建更具交互性、更易用的应用程序。

常见问题解答

  1. 如何处理大型数据集?
    使用惰性加载技术,仅在需要时加载子项。

  2. 如何处理嵌套的二级联动?
    使用多个 HorizontalPager 组件嵌套。

  3. 如何在子项中传递数据?
    在子项数据类中使用 ParcelableSerializable

  4. 如何自定义子项的外观?
    覆盖 Tab 组件的 content 函数。

  5. 如何禁用子项的可点击性?
    clickable 参数设置为 false