RecyclerView 默认没有提供 divider 支持,但其提供的 ItemDecoration 可以实现 divider
AssemblyAdapter 的 assemblyadapter-common-recycler-divider 模块提供了一整套强大的 divider 支持,如下:
- LinearDividerItemDecoration:为 LinearLayoutManager 提供 Divider
- GridDividerItemDecoration:为 GridLayoutManager 提供 Divider
- StaggeredGridDividerItemDecoration:为 StaggeredGridLayoutManager 提供 Divider
支持特性有:
- 支持横向、竖向
- 支持 RTL
- 支持 side divider:如果当前是竖向滑动,那么横向上的 divider 就是 side divider,横向滑动时反之
- divider 支持按 position 或 spanIndex 个性化或禁用
示例
val linearDividerItemDecoration = LinearDividerItemDecoration.Builder(context).apply {
// divider 为红色 5 个像素
divider(Divider.color(Color.RED, 5)) {
// 但是 position 为 10 的 item 的 divider 为 蓝色 5 个像素
personaliseByPosition(10, Divider.color(Color.BLUE, 5))
// 同时 position 为 5 的 item 没有 divider
disableByPosition(5)
}
// 头部和尾巴 divider 为空白 20 个像素(默认不显示头部和尾巴 divider)
headerAndFooterDivider(Divider.space(20))
// side 头部和尾巴 divider 为绿色 5 个像素
sideHeaderAndFooterDivider(Divider.color(Color.GREEN, 5))
}.build()
recyclerView.addItemDecoration(linearDividerItemDecoration)
支持设置六种 divider,分别如下(以垂直滑动方向为例,横向滑动时换位即可):
- divider:显示在滑动方向上每个 item(最后一个 item 除外)的 bottom 边
- headerDivider:显示在滑动方向上第一个 item 的 top 边
- footerDivider:显示在滑动方向上最后一个 item 的 bottom 边
- sideDivider:显示在非滑动方向上每个 item(最后一个 item 除外)的 right 边。
LinearDividerItemDecoration 不支持
- sideHeaderDivider:显示在非滑动方向上第一个 item 的 left 边
- sideFooterDivider:显示在非滑动方向上最后一个 item 的 right 边
Divider 提供了 color、drawable、space 三个系列的方法来方便使用者配置 divider,并且每个系列都提供了不同方法来精确的指定 divider 的尺寸,详细使用请参考 Divider 源码
assemblyadapter-recycler 模块还提供了支持通过 ItemFactory 个性化或禁用 divider 的 ItemDecoration,如下:
- AssemblyLinearDividerItemDecoration:在 LinearDividerItemDecoration 的基础上支持通过 ItemFactory 个性化或禁用 divider
- AssemblyGridDividerItemDecoration:在 GridDividerItemDecoration 的基础上支持通过 ItemFactory 个性化或禁用 divider
- AssemblyStaggeredGridDividerItemDecoration:在 StaggeredGridDividerItemDecoration 的基础上支持通过 ItemFactory 个性化或禁用 divider
示例
// ListSeparatorItemFactory 是一个列表分割符 ItemFactory 具体实现就不写了
val linearDividerItemDecoration = AssemblyLinearDividerItemDecoration.Builder(context).apply {
// divider 为红色 5 个像素
divider(Divider.color(Color.RED, 5)) {
personaliseByItemFactoryClass(
ListSeparatorItemFactory::class,
Divider.color(Color.BLUE, 5)
)
}
}.build()
recyclerView.addItemDecoration(linearDividerItemDecoration)
assemblyadapter-common-recycler-divider 模块还提供了一套扩展支持位于 DividerExtensions.kt,如下:
- RecyclerView.newLinearDividerItemDecoration(): LinearDividerItemDecoration
- RecyclerView.newGridDividerItemDecoration(): GridDividerItemDecoration
- RecyclerView.newStaggeredGridDividerItemDecoration(): StaggeredGridDividerItemDecoration
- RecyclerView.addLinearDividerItemDecoration()
- RecyclerView.addGridDividerItemDecoration()
- RecyclerView.addStaggeredGridDividerItemDecoration()
assemblyadapter-recycler 模块也提供了一套扩展支持位于 AssemblyDividerExtensions.kt,如下:
- RecyclerView.newAssemblyLinearDividerItemDecoration(): AssemblyLinearDividerItemDecoration
- RecyclerView.newAssemblyGridDividerItemDecoration(): AssemblyGridDividerItemDecoration
- RecyclerView.newAssemblyStaggeredGridDividerItemDecoration(): AssemblyStaggeredGridDividerItemDecoration
- RecyclerView.addAssemblyLinearDividerItemDecoration()
- RecyclerView.addAssemblyGridDividerItemDecoration()
- RecyclerView.addAssemblyStaggeredGridDividerItemDecoration()
assemblyadapter-common-recycler-divider 提供了 DividerRecyclerView 可以在布局中配置 divider,支持的属性及示例请参考以下布局:
- fragment_divider_sample_grid_drawable_hor.xml
- fragment_divider_sample_grid_drawable_ver.xml
- fragment_divider_sample_grid_insets_hor.xml
- fragment_divider_sample_grid_insets_ver.xml
- fragment_divider_sample_grid_size_hor.xml
- fragment_divider_sample_grid_size_ver.xml
- fragment_divider_sample_linear_drawable_hor.xml
- fragment_divider_sample_linear_drawable_ver.xml
- fragment_divider_sample_linear_insets_hor.xml
- fragment_divider_sample_linear_insets_ver.xml
- fragment_divider_sample_linear_size_hor.xml
- fragment_divider_sample_linear_size_ver.xml
- fragment_divider_sample_staggered_grid_drawable_hor.xml
- fragment_divider_sample_staggered_grid_drawable_ver.xml
- fragment_divider_sample_staggered_grid_insets_hor.xml
- fragment_divider_sample_staggered_grid_insets_ver.xml
- fragment_divider_sample_staggered_grid_size_hor.xml
- fragment_divider_sample_staggered_grid_size_ver.xml