במדריך הזה נסביר איך לסנן רשימה של מחרוזות על סמך קלט טקסט ב-Jetpack Compose. אפשר להשתמש בגישה הזו כדי לעדכן רשימה באופן דינמי על סמך שאילתות החיפוש של המשתמשים.
תאימות גרסאות
ההטמעה הזו פועלת עם Compose בגרסה 1.2.0 ואילך.
יחסי תלות
צריך לכלול את יחסי התלות הבאים ב-build.gradle:
סינון רשימה על סמך קלט טקסט
יחד, קטעי הקוד הבאים יוצרים רשימה שמתעדכנת בזמן אמת בזמן שהמשתמש מקלידים. בדוגמה הזו נעשה שימוש ב-ViewModel כדי לאחסן את נתוני הרשימה ואת הלוגיקה של הסינון, ואילו הפונקציה FilterTextView() יוצרת את ממשק המשתמש שמתעדכן באופן אוטומטי בכל פעם ששינוי מתבצע בטקסט של המסנן.
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) } } }
נקודות עיקריות לגבי הקוד
- קוד
ViewModelמספק ניתוח תיאורטי של עבודת הסינון, מחוץ לרכיב הניתן ליצירה. - המאפיין
ViewModelמכיל גם את הרשימה המקורית וגם את הרשימה המסוננת. הוא מגדיר רשימה של פריטים ו-MutableStateFlowלאחסון הפריטים המסוננים. - הפונקציה
filterTextמסננת את הרשימה על סמך מחרוזת הקלט שצוינה ומעדכנת את המצבfilteredItems, שמוחזר לממשק המשתמש.
@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) ) } } } }
נקודות עיקריות לגבי הקוד
- הצגת
OutlinedTextFieldעבור קלט המשתמש ו-LazyColumnכדי להציג את הפריטים המסוננים ברשימה. - הפונקציה אוספת את זרימת המצבים של
filteredItemsמה-ViewModelוממירה אותה לאובייקטStateעם תמיכה במחזור חיים.collectAsStateWithLifecycleאוסף את הערך העדכני מ-StateFlowומרכיב מחדש את ממשק המשתמש כשהערך משתנה.
text by rememberSaveable { mutableStateOf("") }יוצר משתנה מצבtextששומר את הטקסט הנוכחי שהוזן בשדה הטקסט של המסנן.rememberSaveableשומרת את ערך הטקסט במהלך שינויים בהגדרות.- מילת המפתח
byמעבירה את הערך של הטקסט למאפיין value של האובייקטMutableState.
OutlinedTextFieldקורא לפונקציהfilterTextממודל התצוגה כששינויים בטקסט מפעילים את פונקציית הקריאה החוזרתonValueChange.
התוצאה
אוספים שמכילים את המדריך הזה
המדריך הזה הוא חלק מהאוספים הבאים של מדריכים מהירים, שמכסים יעדים רחבים יותר לפיתוח Android: