В этом руководстве объясняется, как фильтровать список строк на основе ввода текста в 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абстрагирует работу фильтрации от составного объекта. -
ViewModelсодержит как исходные, так и отфильтрованные списки. Он определяет список элементов иMutableStateFlowдля хранения отфильтрованных элементов. - Функция
filterTextфильтрует список на основе предоставленной входной строки и обновляет состояниеfilteredItems, которое передается обратно в пользовательский интерфейс.
@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и перекомпоновывает пользовательский интерфейс при изменении значения.
-
-
text by rememberSaveable { mutableStateOf("") }создает переменную состоянияtextдля хранения текущего текста, введенного в текстовое поле фильтра.-
rememberSaveableсохраняет значение текста при изменении конфигурации. - Ключевое слово
byделегирует значение текста свойству value объектаMutableState.
-
-
OutlinedTextFieldвызывает функциюfilterTextиз модели представления, когда изменения текста вызывают обратный вызовonValueChange.
Результат
Коллекции, содержащие это руководство
Это руководство является частью тщательно подобранной коллекции быстрых руководств, охватывающих более широкие цели разработки Android:
