En esta guía, se explica cómo filtrar una lista de cadenas según la entrada de texto en Jetpack Compose. Usa este enfoque para actualizar de forma dinámica una lista según las consultas de búsqueda de los usuarios.
Compatibilidad de versiones
Esta implementación funciona con Compose 1.2.0 y versiones posteriores.
Dependencias
Incluye las siguientes dependencias en tu build.gradle:
Cómo filtrar una lista según la entrada de texto
En conjunto, los siguientes fragmentos producen una lista que se actualiza en tiempo real a medida que el usuario escribe. En este ejemplo, se usa un ViewModel para contener los datos de la lista y la lógica de filtrado, mientras que la función FilterTextView() crea la IU que se actualiza automáticamente cada vez que cambia el texto del filtro.
class FilterTextViewModel : ViewModel() { private val items = listOf( "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich" ) private val _filteredItems = MutableStateFlow(items) var filteredItems: StateFlow<List<String>> = _filteredItems fun filterText(input: String) { // This filter returns the full items list when input is an empty string. _filteredItems.value = items.filter { it.contains(input, ignoreCase = true) } } }
Puntos clave sobre el código
- El código ViewModelabstrae el trabajo de filtrado del elemento componible.
- ViewModelcontiene las listas originales y filtradas. Define una lista de elementos y un- MutableStateFlowpara contener los elementos filtrados.
- La función filterTextfiltra la lista según la cadena de entrada proporcionada y actualiza el estadofilteredItems, que se pasa a la IU.
@Composable fun FilterTextView(modifier: Modifier = Modifier, viewModel: FilterTextViewModel = viewModel()) { val filteredItems by viewModel.filteredItems.collectAsStateWithLifecycle() var text by rememberSaveable { mutableStateOf("") } Column( modifier = Modifier .fillMaxSize() .padding(all = 10.dp) ) { OutlinedTextField( value = text, onValueChange = { text = it viewModel.filterText(text) }, label = { Text("Filter Text") }, modifier = Modifier.fillMaxWidth() ) LazyColumn { items( count = filteredItems.size, key = { index -> filteredItems[index] } ) { ListItem( headlineContent = { Text(filteredItems[it]) }, modifier = Modifier .fillParentMaxWidth() .padding(10.dp) ) } } } }
Puntos clave sobre el código
- Muestra un OutlinedTextFieldpara la entrada del usuario y unLazyColumnpara mostrar los elementos de la lista filtrada.
- Recopila el flujo de estado filteredItemsdeViewModely lo convierte en un objetoStateconsciente del ciclo de vida.- collectAsStateWithLifecyclerecopila el valor más reciente de- StateFlowy recompone la IU cuando cambia el valor.
 
- text by rememberSaveable { mutableStateOf("") }crea una variable de estado- textpara contener el texto actual ingresado en el campo de texto del filtro.- rememberSaveableconserva el valor del texto en los cambios de configuración.
- La palabra clave bydelega el valor de texto a la propiedad de valor del objetoMutableState.
 
- OutlinedTextFieldllama a la función- filterTextdesde el modelo de vista cuando los cambios de texto activan la devolución de llamada- onValueChange.
Resultado
Colecciones que contienen esta guía
Esta guía forma parte de estas colecciones de guías rápidas seleccionadas que abarcan objetivos más amplios de desarrollo de Android:
 
        