如何无索引实现日历列表指定分组后日历项的删除及折叠?
实现方案
核心思路
通过遍历列表并维护状态标记,分三个阶段处理元素:
- 未找到目标分组时,直接保留所有元素
- 找到目标分组时,修改其
collapsed属性并加入结果,同时标记已触发后续过滤逻辑 - 触发过滤逻辑后,仅保留非
CalendarDrawerCalendarItem类型的元素
类定义参考(基于需求推导)
sealed class CalendarDrawerListItem { data class CalendarDrawerGroupItem(val groupId: String, var collapsed: Boolean = false) : CalendarDrawerListItem() data class CalendarDrawerCalendarItem(val calendarId: String) : CalendarDrawerListItem() // 可扩展其他子类型 }
代码实现
fun processCalendarList( originalList: List<CalendarDrawerListItem>, targetGroupId: String ): List<CalendarDrawerListItem> { var hasFoundTargetGroup = false return originalList.fold(mutableListOf()) { result, item -> when { !hasFoundTargetGroup -> { if (item is CalendarDrawerListItem.CalendarDrawerGroupItem && item.groupId == targetGroupId) { // 修改目标分组的collapsed属性并加入结果 val updatedGroup = item.copy(collapsed = true) result.add(updatedGroup) hasFoundTargetGroup = true } else { result.add(item) } } else -> { // 目标分组之后,仅保留非CalendarDrawerCalendarItem的元素 if (item !is CalendarDrawerListItem.CalendarDrawerCalendarItem) { result.add(item) } } } result } }
输入输出示例验证
输入列表:
val inputList = listOf( CalendarDrawerListItem.CalendarDrawerGroupItem("group1", false), CalendarDrawerListItem.CalendarDrawerCalendarItem("cal1"), CalendarDrawerListItem.CalendarDrawerGroupItem("targetGroup", false), CalendarDrawerListItem.CalendarDrawerCalendarItem("cal2"), CalendarDrawerListItem.CalendarDrawerCalendarItem("cal3"), CalendarDrawerListItem.CalendarDrawerGroupItem("group2", false) )
调用方法后输出:
listOf( CalendarDrawerListItem.CalendarDrawerGroupItem("group1", false), CalendarDrawerListItem.CalendarDrawerCalendarItem("cal1"), CalendarDrawerListItem.CalendarDrawerGroupItem("targetGroup", true), // collapsed已设为true CalendarDrawerListItem.CalendarDrawerGroupItem("group2", false) // 保留后续分组,删除了cal2、cal3 )
关键说明
- 全程未使用索引或硬编码位置,仅通过状态标记控制流程
- 采用
fold函数实现遍历与结果累积,贴合Kotlin函数式编程风格 - 若需处理所有匹配的目标分组,只需调整状态标记逻辑(移除
hasFoundTargetGroup的单次触发限制即可)
内容的提问来源于stack exchange,提问作者corteg2501
相关产品推荐
相关产品推荐

