如何在Jetpack Compose的LazyVerticalGrid中通过弹出菜单增删条目
Jetpack Compose LazyVerticalGrid 弹出菜单增删条目示例
下面是一个简单易懂的实现,核心用mutableStateListOf维护列表数据,每个条目点击后弹出菜单完成增删操作:
import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun GridWithMenuDemo() { // 用 mutableStateListOf 维护列表,自动触发UI重组 val itemList = remember { mutableStateListOf("条目1", "条目2", "条目3") } // 记录弹出菜单的显示状态和选中的条目索引 var isMenuExpanded by remember { mutableStateOf(false) } var selectedItemIndex by remember { mutableStateOf(-1) } Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { LazyVerticalGrid( columns = GridCells.Fixed(2), contentPadding = PaddingValues(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { items(itemList) { item -> val index = itemList.indexOf(item) Card( modifier = Modifier .size(150.dp) .clickable { selectedItemIndex = index isMenuExpanded = true }, elevation = CardDefaults.cardElevation(4.dp) ) { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text = item) } } } } // 弹出菜单 DropdownMenu( expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false } ) { DropdownMenuItem( text = { Text("添加新条目") }, leadingIcon = { Icon(Icons.Default.Add, contentDescription = "添加") }, onClick = { itemList.add("新条目${itemList.size + 1}") isMenuExpanded = false } ) DropdownMenuItem( text = { Text("删除当前条目") }, leadingIcon = { Icon(Icons.Default.Delete, contentDescription = "删除") }, onClick = { if (selectedItemIndex != -1 && selectedItemIndex < itemList.size) { itemList.removeAt(selectedItemIndex) } isMenuExpanded = false } ) } } }
核心逻辑说明:
- 状态管理:
mutableStateListOf是Compose专为列表设计的可观察集合,修改后会自动触发UI更新,无需手动通知重组。 - 菜单触发:每个卡片点击时,记录当前条目索引并打开菜单;如果需要长按触发,可将
clickable替换为pointerInput处理长按事件。 - 增删操作:直接调用集合的
add和removeAt方法修改数据,操作完成后关闭菜单即可。
这个实现没有复杂的架构或依赖,新手可以直接复制到项目中运行测试,快速理解核心逻辑。
内容的提问来源于stack exchange,提问作者Wangu Ngalati
相关产品推荐
相关产品推荐

