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
ViewModel
abstrai o trabalho de filtragem do elemento combinável. - O
ViewModel
contém as listas originais e filtradas. Ele define uma lista de itens e umMutableStateFlow
para armazenar os itens filtrados. - A função
filterText
filtra 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
OutlinedTextField
para a entrada do usuário e umLazyColumn
para mostrar os itens da lista filtrados. - Coleta o fluxo de estado
filteredItems
doViewModel
e o converte em um objetoState
ciente do ciclo de vida.- O
collectAsStateWithLifecycle
coleta o valor mais recente doStateFlow
e recompõe a interface quando o valor muda.
- O
text by rememberSaveable { mutableStateOf("") }
cria uma variável de estadotext
para armazenar o texto atual inserido no campo de texto do filtro.- O
rememberSaveable
preserva o valor do texto em todas as mudanças de configuração. - A palavra-chave
by
delega o valor de texto à propriedade value do objetoMutableState
.
- O
OutlinedTextField
chama a funçãofilterText
do 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:
