Я переношу приложение из режима просмотра в режим создания. Приложение было написано на Java, поэтому мне нужно перенести пользовательский интерфейс на Kotlin.
Я предпочитаю делать это как можно постепенно, а не оставлять ViewModel на Java.
Пользовательский интерфейс — это ленивый столбец карточек. Длительное нажатие на карточку переключает ее выбранное состояние. Он отправляет событие в ViewModel — добавление/удаление своего идентификатора в/из списка, содержащего идентификаторы выбранных карточек.
Я бы хотел, чтобы пользовательский интерфейс наблюдал за изменениями в списке. идентификаторов.
В настоящее время я использую обходной путь: наблюдаемое логическое значение, которое переключается при каждом изменении в списке идентификаторов. Интересно, есть ли лучший подход.
Некоторые коды:
Часть пользовательского интерфейса — функция, отображающая карточку:
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun DisplayAlarmItem(alarmItem: AlarmItem) {
// Force this function to be called when list of selected changes
val selectToggle by parent!!.alarmViewModel.selectToggleObserve.observeAsState( )
val toggled = if (selectToggle!=null && selectToggle as Boolean) "A" else "B"
// Get list of selected alarms and mark this item as selected(yes/no)
val selectedAlarmList by parent!!.alarmViewModel.selectedItems.observeAsState()
val filterList = selectedAlarmList?.filter { it.equals(alarmItem.createTime.toInt()) }
var selected= (filterList != null && filterList.isNotEmpty())
val backgroundColor = if (selected) MaterialTheme.colorScheme.surfaceVariant else MaterialTheme.colorScheme.surface
val currentAlpha = if (alarmItem.isActive) 1.0f else 0.3f
Card(
modifier = Modifier
.padding(5.dp)
.fillMaxWidth()
.combinedClickable(
onLongClick = { AlarmItemLongClicked(alarmItem.getCreateTime()) },
onClickLabel = "Edit Alarm"
)
{ AlarmItemEdit(alarmItem, true) }
.background(MaterialTheme.colorScheme.surface)
.wrapContentHeight(),
shape = MaterialTheme.shapes.small,
elevation = CardDefaults.elevatedCardElevation(5.dp),
colors = CardDefaults.cardColors(containerColor = backgroundColor),
) {
ConstraintLayout(modifier = Modifier.fillMaxSize()) {
val refLabel = createRef()
val refBell = createRef()
val refAlarmTime = createRef()
val refAlarmActive = createRef()
val refAmPm24h = createRef()
val refWeekdays = createRef()
}
}
}
Теперь обратный вызов Long Click:
private fun AlarmItemLongClicked(id: Long) {
// get the list of alarms
//List alarmItems = parent.alarmViewModel.getAlarmList().getValue();
//if (alarmItems==null) return;
// Update the list of the selected items - simply toggle
parent!!.alarmViewModel.toggleSelection(id)
// Modify toolbar according to number of selected items
parent!!.UpdateOptionMenu()
// Inform the ViewModel that the selection List was changed
parent?.alarmViewModel?.selectToggleObserve()
}
В ViewModel код, который добавляет/удаляет идентификатор из списка выбранных идентификаторов:
public void toggleSelection(long id){
int index = selectedItems.indexOf((int)id);
if (index >=0)
selectedItems.remove(index);
else
selectedItems.add((int)id);
LiveSelectedItems.setValue(selectedItems);
selectToggleObserve();
Определения вышеуказанных свойств:
private final MutableLiveData LiveSelectedItems;
private final ArrayList selectedItems;
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-ui-is-in
Как наблюдать за изменениями в списке, когда ViewModel находится на Java, а пользовательский интерфейс — на Jetpack Comp ⇐ JAVA
Программисты JAVA общаются здесь
1727947929
Anonymous
Я переношу приложение из режима просмотра в режим создания. Приложение было написано на Java, поэтому мне нужно перенести пользовательский интерфейс на Kotlin.
Я предпочитаю делать это как можно постепенно, а не оставлять ViewModel на Java.
Пользовательский интерфейс — это ленивый столбец карточек. Длительное нажатие на карточку переключает ее [b]выбранное[/b] состояние. Он отправляет событие в ViewModel — добавление/удаление своего идентификатора в/из списка, содержащего идентификаторы выбранных карточек.
Я бы хотел, чтобы пользовательский интерфейс наблюдал за изменениями в списке. идентификаторов.
В настоящее время я использую обходной путь: наблюдаемое логическое значение, которое переключается при каждом изменении в списке идентификаторов. Интересно, есть ли лучший подход.
Некоторые коды:
Часть пользовательского интерфейса — функция, отображающая карточку:
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun DisplayAlarmItem(alarmItem: AlarmItem) {
// Force this function to be called when list of selected changes
val selectToggle by parent!!.alarmViewModel.selectToggleObserve.observeAsState( )
val toggled = if (selectToggle!=null && selectToggle as Boolean) "A" else "B"
// Get list of selected alarms and mark this item as selected(yes/no)
val selectedAlarmList by parent!!.alarmViewModel.selectedItems.observeAsState()
val filterList = selectedAlarmList?.filter { it.equals(alarmItem.createTime.toInt()) }
var selected= (filterList != null && filterList.isNotEmpty())
val backgroundColor = if (selected) MaterialTheme.colorScheme.surfaceVariant else MaterialTheme.colorScheme.surface
val currentAlpha = if (alarmItem.isActive) 1.0f else 0.3f
Card(
modifier = Modifier
.padding(5.dp)
.fillMaxWidth()
.combinedClickable(
onLongClick = { AlarmItemLongClicked(alarmItem.getCreateTime()) },
onClickLabel = "Edit Alarm"
)
{ AlarmItemEdit(alarmItem, true) }
.background(MaterialTheme.colorScheme.surface)
.wrapContentHeight(),
shape = MaterialTheme.shapes.small,
elevation = CardDefaults.elevatedCardElevation(5.dp),
colors = CardDefaults.cardColors(containerColor = backgroundColor),
) {
ConstraintLayout(modifier = Modifier.fillMaxSize()) {
val refLabel = createRef()
val refBell = createRef()
val refAlarmTime = createRef()
val refAlarmActive = createRef()
val refAmPm24h = createRef()
val refWeekdays = createRef()
}
}
}
Теперь обратный вызов Long Click:
private fun AlarmItemLongClicked(id: Long) {
// get the list of alarms
//List alarmItems = parent.alarmViewModel.getAlarmList().getValue();
//if (alarmItems==null) return;
// Update the list of the selected items - simply toggle
parent!!.alarmViewModel.toggleSelection(id)
// Modify toolbar according to number of selected items
parent!!.UpdateOptionMenu()
// Inform the ViewModel that the selection List was changed
parent?.alarmViewModel?.selectToggleObserve()
}
В ViewModel код, который добавляет/удаляет идентификатор из списка выбранных идентификаторов:
public void toggleSelection(long id){
int index = selectedItems.indexOf((int)id);
if (index >=0)
selectedItems.remove(index);
else
selectedItems.add((int)id);
LiveSelectedItems.setValue(selectedItems);
selectToggleObserve();
Определения вышеуказанных свойств:
private final MutableLiveData LiveSelectedItems;
private final ArrayList selectedItems;
Подробнее здесь: [url]https://stackoverflow.com/questions/79049922/how-to-observe-changes-in-a-list-when-the-viewmodel-is-in-java-and-the-ui-is-in[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия