Panduan ini menjelaskan cara memfilter daftar string berdasarkan input teks di Jetpack Compose. Gunakan pendekatan ini untuk memperbarui daftar secara dinamis berdasarkan kueri penelusuran pengguna.
Kompatibilitas versi
Implementasi ini berfungsi dengan Compose versi 1.2.0 dan yang lebih tinggi.
Dependensi
Sertakan dependensi berikut dalam build.gradle Anda:
Memfilter daftar berdasarkan input teks
Bersama-sama, cuplikan berikut menghasilkan daftar yang diperbarui secara real time saat
pengguna mengetik. Contoh ini menggunakan ViewModel
untuk menyimpan data daftar dan logika pemfilteran, sedangkan fungsi FilterTextView()
membuat UI yang diperbarui secara otomatis setiap kali teks filter berubah.
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) } } }
Poin-poin penting tentang kode
- Kode
ViewModelmemisahkan pekerjaan pemfilteran dari composable. ViewModelmenyimpan daftar asli dan yang difilter. Class ini menentukan daftar item danMutableStateFlowuntuk menyimpan item yang difilter.- Fungsi
filterTextmemfilter daftar berdasarkan string input yang diberikan dan memperbarui statusfilteredItems, yang diteruskan kembali ke 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) ) } } } }
Poin-poin penting tentang kode
- Menampilkan
OutlinedTextFielduntuk input pengguna danLazyColumnuntuk menampilkan item daftar yang difilter. - Mengumpulkan alur status
filteredItemsdariViewModeldan mengonversinya menjadi objekStateyang mendukung siklus proses.collectAsStateWithLifecyclemengumpulkan nilai terbaru dariStateFlowdan merekomposisi UI saat nilai berubah.
text by rememberSaveable { mutableStateOf("") }membuat variabel statustextuntuk menyimpan teks saat ini yang dimasukkan di kolom teks filter.rememberSaveablemempertahankan nilai teks di seluruh perubahan konfigurasi.- Kata kunci
bymendelegasikan nilai teks ke properti nilai objekMutableState.
OutlinedTextFieldmemanggil fungsifilterTextdari model tampilan saat perubahan teks memicu callbackonValueChange.
Hasil
Koleksi yang berisi panduan ini
Panduan ini adalah bagian dari koleksi Panduan Cepat pilihan yang membahas sasaran pengembangan Android yang lebih luas: