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 bir- MutableStateFlowtanımlar.
- filterTextişlevi, listeyi sağlanan giriş dizesine göre filtreler ve kullanıcı arayüzüne geri aktarılan- filteredItemsdurumunu 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ğından- filteredItemsdurum akışını toplar ve yaşam döngüsü bilincine sahip bir- Statenesnesine 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şkeni- textoluşturur.- rememberSaveable, yapılandırma değişikliklerinde metnin değerini korur.
- byanahtar kelimesi, text değerini- MutableStatenesnesinin 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:
 
        