يوضّح هذا الدليل كيفية الفلترة من خلال قائمة سلاسل استنادًا إلى إدخال النص في Jetpack Compose. استخدِم هذه الطريقة لتعديل قائمة ديناميكيًا استنادًا إلى طلبات بحث المستخدِم.
توافق الإصدار
يعمل هذا التنفيذ مع الإصدار 1.2.0 من تطبيق Compose والإصدارات الأحدث.
التبعيات
أدرِج التبعيات التالية في 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 الأوسع نطاقًا: