Este guia explica como filtrar uma lista de strings com base na entrada de texto no Jetpack Compose. Use essa abordagem para atualizar dinamicamente uma lista com base nas consultas de pesquisa do usuário.
Compatibilidade de versões
Essa implementação funciona com as versões 1.2.0 e mais recentes do Compose.
Dependências
Inclua as seguintes dependências no build.gradle:
Filtrar uma lista com base na entrada de texto
Juntos, os snippets a seguir produzem uma lista que é atualizada em tempo real conforme o
usuário digita. Este exemplo usa um ViewModel
para armazenar os dados da lista e a lógica de filtragem, enquanto a função FilterTextView()
cria a interface que é atualizada automaticamente sempre que o texto do filtro muda.
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) } } }
Pontos principais sobre o código
- O código
ViewModelabstrai o trabalho de filtragem do elemento combinável. - O
ViewModelcontém as listas originais e filtradas. Ele define uma lista de itens e umMutableStateFlowpara armazenar os itens filtrados. - A função
filterTextfiltra a lista com base na string de entrada fornecida e atualiza o estadofilteredItems, que é transmitido de volta à interface.
@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) ) } } } }
Pontos principais sobre o código
- Mostra um
OutlinedTextFieldpara a entrada do usuário e umLazyColumnpara mostrar os itens da lista filtrados. - Coleta o fluxo de estado
filteredItemsdoViewModele o converte em um objetoStateciente do ciclo de vida.- O
collectAsStateWithLifecyclecoleta o valor mais recente doStateFlowe recompõe a interface quando o valor muda.
- O
text by rememberSaveable { mutableStateOf("") }cria uma variável de estadotextpara armazenar o texto atual inserido no campo de texto do filtro.- O
rememberSaveablepreserva o valor do texto em todas as mudanças de configuração. - A palavra-chave
bydelega o valor de texto à propriedade value do objetoMutableState.
- O
OutlinedTextFieldchama a funçãofilterTextdo modelo de visualização quando as mudanças de texto acionam o callbackonValueChange.
Resultado
Coleções que contêm este guia
Este guia faz parte destas coleções selecionadas de guias rápidos que abrangem metas mais amplas de desenvolvimento para Android: