| 对比维度 | RecyclerView | LazyColumn |
|---|---|---|
| 复用单位 | ViewHolder (View) | Composable (Slot) |
| 回收机制 | RecycledViewPool + scrap | Compose SlotTable 重组 |
| 布局方式 | onLayoutChildren 手动 | LazyLayout 自动测量 |
| 状态保持 | onSaveInstanceState | remember + 保存able |
| 预取 | GapWorker + prefetch | LazyListPrefetchStrategy |
LazyColumn 不会一次性组合所有 item,而是根据 可视区域 + 预取边界 动态组合。
内部使用 LazyListState 控制滚动偏移,通过 LazyLayout 实现按需布局。
💡 只有进入可视区域 + 预取范围的 item 才会被组合,其余保持未组合状态。
key 参数稳定标识,避免状态错乱// 典型 LazyColumn 代码 — 复用关键 LazyColumn { items( items = list, key = { it.id } // 稳定复用 ) { item -> ListItemCard(item) } } // 内部 SlotTable 自动管理 // 滑出屏幕: 插槽保留, 内容挂起 // 滑入屏幕: 插槽激活, 重组 @Composable
✅ 使用 key 提升复用稳定性,避免重组闪烁。
| 阶段 | 行为 | Compose 内部 |
|---|---|---|
| 1. 滑出可视区 | item 不再可见 | SlotTable 标记为 removed,但 Composables 保持 |
| 2. 进入预取区 | 即将显示 | LazyLayout 触发 预组合,复用已有 slot |
| 3. 完全可见 | item 展示 | 重组 (Recompose) 更新内容,无新分配 |
| 4. 远离屏幕 | 超出回收距离 | SlotTable 释放插槽,资源回收 |
♻️ 回收复用循环:滑出 → 回收池 → 预取复用 → 可见