Ce guide explique comment filtrer une liste de chaînes en fonction de la saisie de texte dans Jetpack Compose. Utilisez cette approche pour mettre à jour de manière dynamique une liste en fonction des requêtes de recherche des utilisateurs.
Compatibilité des versions
Cette implémentation fonctionne avec les versions 1.2.0 et ultérieures de Compose.
Dépendances
Incluez les dépendances suivantes dans votre fichier build.gradle:
Filtrer une liste en fonction du texte saisi
Ensemble, les extraits suivants génèrent une liste qui se met à jour en temps réel à mesure que l'utilisateur saisit du texte. Cet exemple utilise un ViewModel pour stocker les données de liste et la logique de filtrage, tandis que la fonction FilterTextView() crée l'UI qui se met à jour automatiquement chaque fois que le texte du filtre change.
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) } } }
Points clés concernant le code
- Le code
ViewModeléloigne le travail de filtrage du composable. ViewModelcontient à la fois les listes d'origine et filtrées. Il définit une liste d'éléments et unMutableStateFlowpour contenir les éléments filtrés.- La fonction
filterTextfiltre la liste en fonction de la chaîne d'entrée fournie et met à jour l'étatfilteredItems, qui est renvoyé dans l'UI.
@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) ) } } } }
Points clés concernant le code
- Affiche un
OutlinedTextFieldpour la saisie utilisateur et unLazyColumnpour afficher les éléments de liste filtrés. - Collecte le flux d'état
filteredItemsà partir deViewModelet le convertit en objetStatetenant compte du cycle de vie.collectAsStateWithLifecyclecollecte la dernière valeur deStateFlowet recompose l'UI lorsque la valeur change.
text by rememberSaveable { mutableStateOf("") }crée une variable d'étattextpour contenir le texte actuel saisi dans le champ de texte du filtre.rememberSaveableconserve la valeur du texte lors des modifications de configuration.- Le mot clé
bydélègue la valeur du texte à la propriété value de l'objetMutableState.
OutlinedTextFieldappelle la fonctionfilterTextà partir du modèle de vue lorsque les modifications de texte déclenchent le rappelonValueChange.
Résultat
Collections contenant ce guide
Ce guide fait partie de ces collections de guides rapides sélectionnées qui couvrent des objectifs de développement Android plus larges: