این راهنما نحوه فیلتر کردن لیست رشته ها را بر اساس ورودی متن در 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انتزاع کار فیلتر کردن را از composable دور می کند. -
ViewModelهر دو لیست اصلی و فیلتر شده را نگه می دارد. لیستی از آیتم ها و یکMutableStateFlowبرای نگهداری آیتم های فیلتر شده تعریف می کند. - تابع
filterTextلیست را بر اساس رشته ورودی ارائه شده فیلتر می کند و حالتfilteredItemsرا به روز می کند که به 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) ) } } } }
نکات کلیدی در مورد کد
- یک
OutlinedTextFieldبرای ورودی کاربر و یکLazyColumnبرای نمایش موارد لیست فیلتر شده نمایش می دهد. - جریان حالت
filteredItemsرا ازViewModelجمعآوری میکند و آن را به یک آبجکتStateآگاه از چرخه حیات تبدیل میکند.-
collectAsStateWithLifecycleآخرین مقدار را ازStateFlowجمعآوری میکند و وقتی مقدار تغییر میکند UI را دوباره ترکیب میکند.
-
-
text by rememberSaveable { mutableStateOf("") }یکtextمتغیر حالت ایجاد می کند تا متن فعلی وارد شده در قسمت متن فیلتر را نگه دارد.-
rememberSaveableمقدار متن را در تغییرات پیکربندی حفظ می کند. - کلمه کلیدی
byمقدار متن را به ویژگی value شیءMutableStateمی دهد.
-
-
OutlinedTextFieldتابعfilterTextرا از مدل view فراخوانی میکند، زمانی که تغییرات متن باعث پاسخ به تماسonValueChangeمیشود.
نتیجه
مجموعه هایی که حاوی این راهنما هستند
این راهنما بخشی از مجموعههای راهنمای Quick Guide است که اهداف توسعه Android گستردهتری را پوشش میدهد:
