You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中用RecyclerView实现指定布局(基于StaggeredGridLayoutManager)

用Kotlin实现基于StaggeredGridLayoutManager的不规则瀑布流布局

先看你提供的布局示例:
不规则瀑布流布局示例

可以完全不依赖第三方库,仅通过StaggeredGridLayoutManager结合ListAdapter实现该布局,以下是具体实现步骤:

1. 定义数据类

创建包含item高度的实体类,用来控制每个item的显示高度,实现不规则效果:

data class StaggeredItem(
    val id: Int,
    val content: String,
    val itemHeight: Int // 控制item的高度
)

2. 实现ListAdapter

继承ListAdapter,通过DiffUtil优化列表更新,同时在ViewHolder中绑定item高度:

class StaggeredAdapter : ListAdapter<StaggeredItem, StaggeredAdapter.ViewHolder>(DiffCallback) {

    companion object DiffCallback : DiffUtil.ItemCallback<StaggeredItem>() {
        override fun areItemsTheSame(oldItem: StaggeredItem, newItem: StaggeredItem): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: StaggeredItem, newItem: StaggeredItem): Boolean {
            return oldItem == newItem
        }
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val contentTv: TextView = itemView.findViewById(R.id.tv_content)

        fun bind(item: StaggeredItem) {
            contentTv.text = item.content
            // 动态设置item高度
            itemView.layoutParams.apply {
                height = item.itemHeight
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_staggered, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}

3. 编写Item布局

创建item_staggered.xml,定义单个item的基础样式:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:background="#f5f5f5"
    android:layout_margin="4dp"
    android:gravity="center"
    android:textColor="#333333"/>

4. 配置RecyclerView(在Activity/Fragment中)

初始化RecyclerView,设置StaggeredGridLayoutManager并绑定Adapter:

class MainActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: StaggeredAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView = findViewById(R.id.recyclerView)
        // 初始化2列垂直瀑布流布局,可根据需求修改列数
        val layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
        // 可选:关闭自动填补间隙,避免item位置跳动
        layoutManager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_NONE
        recyclerView.layoutManager = layoutManager

        adapter = StaggeredAdapter()
        recyclerView.adapter = adapter

        // 生成测试数据:随机高度模拟不规则效果
        val testItems = mutableListOf<StaggeredItem>()
        repeat(20) {
            val randomHeight = (200..800).random()
            testItems.add(StaggeredItem(it, "Item $it", randomHeight))
        }
        adapter.submitList(testItems)
    }
}

关键说明

  • 不规则效果的核心是给每个item设置不同的高度,StaggeredGridLayoutManager会自动根据item高度排列,形成瀑布流效果
  • 如果需要多种item类型,只需重写getItemViewType,创建对应ViewHolder并设置不同高度即可
  • 全程使用Android原生组件,无需依赖任何第三方库

内容的提问来源于stack exchange,提问作者Eddie Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:15:16