Bu kılavuzda, Jetpack Compose'da metin girişine göre dize listesinin nasıl filtreleneceği açıklanmaktadır. Bir listeyi kullanıcı arama sorgularına göre dinamik olarak güncellemek için bu yaklaşımı kullanın.
Sürüm uyumluluğu
Bu uygulama, Compose 1.2.0 ve sonraki sürümleriyle çalışır.
Bağımlılıklar
build.gradle dosyanıza aşağıdaki bağımlılıkları ekleyin:
Bir listeyi metin girişine göre filtreleme
Aşağıdaki snippet'ler birlikte, kullanıcı yazarken gerçek zamanlı olarak güncellenen bir liste oluşturur. Bu örnekte, liste verilerini ve filtreleme mantığını tutmak için bir ViewModel kullanılırken FilterTextView() işlevi, filtre metni değiştiğinde otomatik olarak güncellenen kullanıcı arayüzünü oluşturur.
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) } } }
Kodla ilgili önemli noktalar
ViewModelkodu, filtreleme işlemini kompozitten soyutlar.ViewModelhem orijinal hem de filtrelenmiş listeleri içerir. Bir öğe listesi ve filtrelenen öğeleri barındıracak birMutableStateFlowtanımlar.filterTextişlevi, listeyi sağlanan giriş dizesine göre filtreler ve kullanıcı arayüzüne geri aktarılanfilteredItemsdurumunu günceller.
@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) ) } } } }
Kodla ilgili önemli noktalar
- Kullanıcı girişi için
OutlinedTextFieldve filtrelenen liste öğelerini görüntülemek içinLazyColumngösterir. ViewModelkaynağındanfilteredItemsdurum akışını toplar ve yaşam döngüsü bilincine sahip birStatenesnesine dönüştürür.collectAsStateWithLifecycle,StateFlow'ten en son değeri toplar ve değer değiştiğinde kullanıcı arayüzünü yeniden oluşturur.
text by rememberSaveable { mutableStateOf("") }, filtre metin alanına girilen mevcut metni tutmak için bir durum değişkenitextoluşturur.rememberSaveable, yapılandırma değişikliklerinde metnin değerini korur.byanahtar kelimesi, text değeriniMutableStatenesnesinin value mülküne atar.
- Metin değişiklikleri
onValueChangegeri çağırma işlevini tetiklediğindeOutlinedTextField, görünüm modelindenfilterTextişlevini çağırır.
Sonuç
Bu kılavuzu içeren koleksiyonlar
Bu kılavuz, daha geniş Android geliştirme hedeflerini kapsayan, özel olarak seçilmiş Hızlı Kılavuz koleksiyonlarından biridir: