Сортировка элементов списка в LazyColumn — Android Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Гость
 Сортировка элементов списка в LazyColumn — Android Jetpack Compose

Сообщение Гость »


Пытаемся реализовать функцию, позволяющую пользователю выбирать способ сортировки списка пивоваренных заводов при выборе определенного элемента в раскрывающемся меню (имя, город, адрес). Мне трудно понять, что я делаю неправильно. Всякий раз, когда я выбираю пример «Имя» в раскрывающемся меню, список пивоваренных заводов не сортируется. Я новичок в этом, поэтому любые советы действительно помогут. Спасибо!

Вот полный код MainScreen -
@SuppressLint("UnusedMaterialScaffoldPaddingParameter") @RequiresApi(Build.VERSION_CODES.O) @Композитный веселый главный экран( навконтроллер: Навконтроллер, MainViewModel: MainViewModel, поиск: Строка? ) { val apiData = BrewData (mainViewModel = mainViewModel, search = search) Строительные леса( содержание = { если (apiData.loading == true){ Столбец( модификатор = Модификатор .fillMaxSize() .background(colorResource(id = R.color.grey_blue)), вертикальноеРасположение = Расположение.Центр, HorizontalAlignment = Alignment.CenterHorizontally ) { ЦиркулярПрогрессИндикатор() } } Еще если (apiData.data != null){ MainContent(bData = apiData.data!!, viewModel = mainViewModel) } }, topBar = { BrewTopBar(navController, search) } ) } @Композитный fun BrewTopBar(navController: NavController, search: String?) { ТопAppBar( модификатор = Модификатор .height(55.dp) .fillMaxWidth(), заголовок = { Текст( stringResource(id = R.string.main_title), стиль = MaterialTheme.typography.h5, макслинес = 1 ) }, действия = { Ряд( вертикальноеВыравнивание = Выравнивание.ЦентрВертикально ) { Текст(текст = "$search") IconButton(onClick = { navController.navigate(Screens.SearchScreen.name) }) { Икона( модификатор = Modifier.padding(10.dp), imageVector = Значки.Заполнено.Поиск, contentDescription = stringResource(id = R.string.search) ) } } }, backgroundColor = colorResource(id = R.color.light_purple) ) } @RequiresApi(Build.VERSION_CODES.O) @Композитный fun MainContent(bData: List
, viewModel: MainViewModel){ val allBreweries = bData.size var sortByName по памяти {mutableStateOf(false)} var sortByCity, запомнив {mutableStateOf(false)} var sortByAddress, запомнив {mutableStateOf(false) } var dataSorted1 = запомнить {mutableStateOf(bData.sortedBy { it.name }) } var dataSorted: MutableState Столбец( модификатор = Модификатор .fillMaxSize() .background(colorResource(id = R.color.grey_blue)) ){ Ряд( модификатор = Modifier.fillMaxWidth(), HorizontalArrangement = Arrangement.SpaceAround, вертикальноеВыравнивание = Выравнивание.ЦентрВертикально ){ // Текстовая метка суммы Текст( text = "Результат(ы): ${bData.size}", модификатор = Modifier.padding(верх = 15.dp, начало = 15.dp, низ = 5.dp) ) SortingMenu(sortByName, sortByCity, sortByAddress) // для сортировки требуются изменяемые логические значения } // Список карточек пивоварни LazyColumn( Модификатор .fillMaxSize() .padding(5.dp) ){ items(allBreweries){ индекс -> Пивоварни( бДанные = когда { sortByName == true -> помните {mutableStateOf(bData.sortedBy { it.name }) } sortByCity == true -> помните {mutableStateOf(bData.sortedBy {it.city }) } sortByAddress == true -> помните {mutableStateOf(bData.sortedBy { it.address_2 }) } еще -> помните {mutableStateOf(bData)} } as MutableState, // Задача: создать способ выбора различных условий сортировки позиция = индекс, Модель просмотра = Модель просмотра ) } } } } @RequiresApi(Build.VERSION_CODES.O) @Композитный веселые пивоварни( bData: MutableState, позиция: Интер, модель просмотра: MainViewModel ){ val cardNumber = позиция+1 val cityApiData = bData.value[позиция].city val phoneNumberApiData = bData.value[position].phone val CountryApiData = bData.value[позиция].страна val BreweryTypeApiData = bData.value[позиция].brewery_type val countyApiData = bData.value[позиция].county_province val postalCodeApiData = bData.value[позиция].postal_code val stateApiData = bData.value[position].state val streetApiData = bData.value[позиция].street val apiLastUpdated = bData.value[позиция].updated_at контекст val = LocalContext.current val LastUpdated = apiLastUpdated?.let { viewModel.dateTextConverter(it) } val веб-сайтUrlApiData = bData.value[позиция].website_url var расширяется с помощью Remember {mutableStateOf(false)} val clickableWebsiteText = buildAnnotatedString { если (websiteUrlApiData! = ноль) { добавить (веб-сайтUrlApiData) } } val clickablePhoneNumberText = buildAnnotatedString { если (phoneNumberApiData! = ноль) { добавить (phoneNumberApiData) } } Столбец( Модификатор.padding(10.dp) ) { //Карточка пивоварни Карта( модификатор = Модификатор .padding(начало = 15.dp, конец = 15.dp) // .fillMaxSize() .кликабельно( включено = правда, onClickLabel = "Развернуть, чтобы просмотреть подробности", onClick = {расширено =!расширено} ) .semantics { contentDescription = "Карточка пивоварни" }, backgroundColor = colorResource(id = R.color.light_blue), contentColor = Цвет.Черный, граница = BorderStroke(0.5.dp, colorResource(id = R.color.pink)), высота = 15.dp ) { Столбец (verticalArrangement = Arrangement.Center) { //Текст номера позиции карты Текст( текст = cardNumber.toString(), модификатор = Modifier.padding(15.dp), размер шрифта = 10.sp, ) // Второй ряд BreweryTitle(bData = bData, позиция = позиция) // Третья строка // Подробности о пивоварне Детали карты( городАпиДанные = городАпиДанные, состояниеАпиДанные = состояниеАпиДанные, streetApiData = streetApiData, странаАпиДанные = странаАпиДанные, графствоАпиДанные = графствоАпиДанные, postalCodeApiData = postalCodeApiData, ТипApiData пивоварни = ДанныеТипаАпипивоварни, последнее обновление = последнее обновление, расширенный = расширенный ) //Четвертая строка Row(horizontalArrangement = Arrangement.Center, модификатор = Модификатор.fillMaxWidth() ){ Столбец( модификатор = Модификатор.padding( начало = 10.дп, конец = 10.дп, верх = 15.дп, низ = 15.дп ), вертикальноеРасположение = Расположение.Центр, HorizontalAlignment = Alignment.CenterHorizontally ) { //Ссылка на номер телефона ЛинкБилдер( кликабельный номер телефонатекст, номер телефонаApiData, модификатор = Modifier.padding(дно = 10.dp) ) { если (phoneNumberApiData! = ноль) { viewModel.callNumber(phoneNumberApiData, контекст) } } //Ссылка на сайт ЛинкБилдер( кликабельныйВеб-сайтТекст, веб-сайтUrlApiData, модификатор = Modifier.padding(дно = 15.dp), намерениеCall = { если (websiteUrlApiData! = ноль) { viewModel.openWebsite(websiteUrlApiData, контекст) } } ) } } } } } } @Композитный забавная информация о карте( cityApiData: Строка?, stateApiData: строка?, streetApiData: Строка?, странаApiData: строка?, countyApiData: строка?, postalCodeApiData: строка?, BreweryTypeApiData: String?, последнее обновление: строка?, развернуто: логическое значение ){ // Третья строка //Подробности о пивоварне Столбец( модификатор = Модификатор.padding( начало = 30.dp, конец = 10.dp, верх = 25.dp, низ = 15.dp ), вертикальное расположение = Расположение.Центр ) { если (расширенный) { Текст(текст = "Город: $cityApiData") Текст (текст = «Состояние: $stateApiData») Текст(текст = "Улица: $streetApiData") Текст (текст = «Страна: $countryApiData») Текст(текст = "Округ: $countyApiData") Text(text = "Почтовый индекс: $postalCodeApiData") Text(text = "Тип: $breweryTypeApiData") Text(text = "Последнее обновление: $lastUpdated") } } } @Композитный fun BreweryTitle(bData: MutableState, позиция: Инт){ // Второй ряд Столбец( модификатор = Modifier.fillMaxWidth(), вертикальноеРасположение = Расположение.Центр, HorizontalAlignment = Alignment.CenterHorizontally ) { Ряд( вертикальноеВыравнивание = Выравнивание.ЦентрВертикально, ГоризонтальноеРасположение = Расположение.Центр, ) { // Название пивоварни Текст( текст = bData.value[позиция].имя!!, модификатор = Modifier.padding(начало = 15.dp, конец = 15.dp), FontWeight = FontWeight.Жирный, макслинии = 3, textAlign = TextAlign.Центр, софтWrap = правда, стиль = ТекстСтиль( цвет = colorResource(id = R.color.purple_500), FontStyle = FontStyle.Normal, FontSize = 17.sp, FontFamily = FontFamily.SansSerif, LetterSpacing = 2.sp, ) ) } } } @Композитный интересный LinkBuilder( кликабельныйтекст: AnnotatedString, dataText: строка?, модификатор: Модификатор, IntentCall: (Строка?) -> Единица измерения ){ если (dataText != ноль){ Кликабельныйтекст( текст = кликабельныйтекст, модификатор = модификатор, стиль = ТекстСтиль( textDecoration = TextDecoration.Underline, LetterSpacing = 2.sp ), onClick = { намерениеCall (текст данных) } ) } еще { Текст( text = "К сожалению, недоступен", цвет = Цвет.Серый, размер шрифта = 10.sp ) } } //Получает данные из модели представления @Композитный весело BrewData( mainViewModel: MainViewModel, поиск: строка? ): DataOrException { return ProductState( InitialValue = DataOrException (загрузка = true) ) { значение = mainViewModel.getData(поиск) }.ценить } @Композитный fun SortingMenu(sortByName: Boolean, sortByCity: Boolean, sortByAddress: Boolean,) { var расширяется с помощью Remember {mutableStateOf(false)} val items = listOf("Имя", "Город", "Адрес") вал отключенЗначение = "B" var selectedIndex, запомнив {mutableStateOf(0)} Коробка( модификатор = Модификатор .wrapContentSize(Alignment.TopStart) ) { Текст( text = "Сортировать по: ${items[selectedIndex]}", модификатор = Модификатор .clickable(onClick = {расширено = true}) .ширина(120.дп) ) Выпадающее меню( расширенный = расширенный, onDismissRequest = {expanded = false // задача: сортировка данных списка при нажатии когда (выбранныйиндекс) { 0 -> сортировка по имени == true 1 -> sortByCity == true 2 -> sortByAddress == true } } ) { items.forEachIndexed { индекс, текст -> DropdownMenuItem(onClick = { выбранныйИндекс = индекс расширенный = ложь }) { val отключенный текст = если (текст == отключенное значение) { " (Неполноценный)" } еще { "" } Текст (текст = текст + отключенный текст) } } } } } //не используется забавная сортировка (menuList: List, dataList: List
, index: Int){ когда{ menuList[index] == "Имя" -> dataList.sortedBy { it.name } menuList[index] == "Город" -> dataList.sortedBy { it.city } menuList[index] == "Адрес" -> dataList.sortedBy { it.address_2 } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»