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
ViewModel
kodu, filtreleme işlemini kompozitten soyutlar.ViewModel
hem orijinal hem de filtrelenmiş listeleri içerir. Bir öğe listesi ve filtrelenen öğeleri barındıracak birMutableStateFlow
tanımlar.filterText
işlevi, listeyi sağlanan giriş dizesine göre filtreler ve kullanıcı arayüzüne geri aktarılanfilteredItems
durumunu 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
OutlinedTextField
ve filtrelenen liste öğelerini görüntülemek içinLazyColumn
gösterir. ViewModel
kaynağındanfilteredItems
durum akışını toplar ve yaşam döngüsü bilincine sahip birState
nesnesine 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şkenitext
oluşturur.rememberSaveable
, yapılandırma değişikliklerinde metnin değerini korur.by
anahtar kelimesi, text değeriniMutableState
nesnesinin value mülküne atar.
- Metin değişiklikleri
onValueChange
geri çağırma işlevini tetiklediğindeOutlinedTextField
, görünüm modelindenfilterText
iş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:
