Questa guida spiega come filtrare un elenco di stringhe in base all'input di testo in Jetpack Compose. Utilizza questo approccio per aggiornare dinamicamente un elenco in base alle query di ricerca degli utenti.
Compatibilità delle versioni
Questa implementazione è compatibile con Compose 1.2.0 e versioni successive.
Dipendenze
Includi le seguenti dipendenze in build.gradle:
Filtrare un elenco in base all'input di testo
I seguenti snippet, se combinati, generano un elenco che si aggiorna in tempo reale in base ai tipi di utenti. Questo esempio utilizza un ViewModel per contenere i dati dell'elenco e la logica di filtro, mentre la funzione FilterTextView() crea l'interfaccia utente che si aggiorna automaticamente ogni volta che il testo del filtro cambia.
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) } } }
Punti chiave del codice
- Il codice
ViewModelesegue l'astrazione del lavoro di filtro dal composable. ViewModelcontiene sia gli elenchi originali che quelli filtrati. Definisce un elenco di elementi e unMutableStateFlowper contenere gli elementi filtrati.- La funzione
filterTextfiltra l'elenco in base alla stringa di input fornita e aggiorna lo statofilteredItems, che viene passato nuovamente all'interfaccia utente.
@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) ) } } } }
Punti chiave del codice
- Mostra un
OutlinedTextFieldper l'input dell'utente e unLazyColumnper visualizzare gli elementi dell'elenco filtrato. - Raccoglie il flusso di stato
filteredItemsdaViewModele lo converte in un oggettoStateconsapevole del ciclo di vita.collectAsStateWithLifecycleraccoglie il valore più recente daStateFlowe ricompone l'interfaccia utente quando il valore cambia.
text by rememberSaveable { mutableStateOf("") }crea una variabile di statotextper contenere il testo corrente inserito nel campo di testo del filtro.rememberSaveablemantiene il valore del testo durante le modifiche alla configurazione.- La parola chiave
bydelega il valore del testo alla proprietà value dell'oggettoMutableState.
OutlinedTextFieldchiama la funzionefilterTextdal modello di visualizzazione quando le modifiche al testo attivano il callbackonValueChange.
Risultato
Raccolte che contengono questa guida
Questa guida fa parte di queste raccolte di guide rapide selezionate che coprono obiettivi di sviluppo Android più ampi: