Как настроить ленивый столбец элементов с таймеромAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как настроить ленивый столбец элементов с таймером

Сообщение Anonymous »

Добрый день Помогите пожалуйста решить вопрос, дело в том, что при использовании LazyColumn у меня нет возможности контролировать состояние таймера в элементах, находящихся вне видимости списка (то есть когда список при прокрутке сбрасываются элементы, выходящие за пределы экрана), и я решил эту проблему, изменив LazyColumn на столбец с вертикальной прокруткой, однако это не так гладко, мне нужно сделать добавление элементов в начало списка, и если Я делаю что-то вроде
Column( Modifier.verticalScroll(rememberScrollState()) ) { dataList.reversed().forEach затем, когда добавляется новый элемент, его счетчик не создается с 0, как предполагалось, а берется из предыдущий элемент, и предыдущий элемент обновляет счетчик до 0, хотя он должен только продолжать подсчитывать свои очки. Как мне обойти ограничения этих двух подходов и найти золотую середину?

Код: Выделить всё

@Composable
fun ColumnWithDynamicItems(
dataList: List
) {
val savedState = remember { mutableStateMapOf() }
val itemStates = remember { mutableStateMapOf() }
val mutex = Mutex()

LazyColumn(
reverseLayout = true
) {
items(dataList) {message ->
if (message.progressDelivered != 1f) {
LaunchedEffect(key1 = message.id) {
var timerValue = savedState[message.id] ?: 0
while (isActive && itemStates[message.id] == true) {
mutex.withLock {
savedState[message.id] = timerValue + 1
timerValue++
delay(1000L)
}
}
}
}
DispatcherItems(
message = message,
savedState = savedState,
onStateChange = { isActive ->
itemStates[message.id] = isActive
Log.d("testet", "  -  Column id ${itemStates[message.id]} active $isActive")
}
)
}
}
}
почему, когда я использую этот код, при создании нового элемента таймер создается с 0, а старый элемент продолжает отображать старое значение, но при прокрутке таймеры элементов, которые вышли за рамки, сбрасываются до нуля
однако, если вы используете этот код

Код: Выделить всё

@Composable
fun ColumnWithDynamicItems(
dataList: List
) {
val savedState = remember { mutableStateMapOf() }
val itemStates = remember { mutableStateMapOf() }
val mutex = Mutex()

Column(
Modifier.verticalScroll(rememberScrollState())
) {
dataList.reversed().forEach { message ->
if (message.progressDelivered != 1f) {
LaunchedEffect(key1 = message.id) {
var timerValue = savedState[message.id] ?: 0
while (isActive && itemStates[message.id] == true) {
mutex.withLock {
savedState[message.id] = timerValue + 1
timerValue++
delay(1000L)
}
}
}
}
DispatcherItems(
message = message,
savedState = savedState,
onStateChange = { isActive ->
itemStates[message.id] = isActive
Log.d("testet", "  -  Column id ${itemStates[message.id]} active $isActive")
}
)
}
}
}
тогда при создании новых элементов таймер стартует с 0 и продолжает работать с предыдущего элемента, а элемент, элемент которого не должен меняться, начинает отсчет с 0, при этом элементы не сбрасываются при прокрутке
Эти два варианта имеют свои недостатки. Как мне объединить код, чтобы при добавлении элементов таймер начинался с 0, и чтобы предыдущие элементы не обновляли таймер и чтобы при прокрутке элементы не обновляли свой таймер при выходе из области видимости?

Код: Выделить всё

@Composable
fun DispatcherItems(
message: MessageType,
savedState: MutableMap,
onStateChange: (Boolean) -> Unit
) {
val expanded = remember { mutableStateOf(false) }
val heightItemExpanded = if (expanded.value) 50.dp else 90.dp
val heightItemExpandedProgress = if (expanded.value) 20.dp else 45.dp

val secondsValueState = remember { mutableStateOf(savedState[message.id] ?: 0) }
val secondsValue = secondsValueState.value
val job = remember {
mutableStateOf(null)
}
LaunchedEffect(key1 = secondsValue) {
if (message.progressDelivered != 1f) {
job.value = launch {
while (isActive) {
delay(1000L)
secondsValueState.value = secondsValue + 1
}
}
}
}

expanded.value = message.progressDelivered == 1f
Как добиться такого поведения, чтобы при добавлении элементы добавлялись сверху и у каждого элемента был свой таймер, который начинал отсчет при добавлении и не останавливался, если при прокрутке элемента происходит не выходить за рамки списка?

Подробнее здесь: https://stackoverflow.com/questions/787 ... th-a-timer
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Android, как управлять направлением анимации элемента? Ресайлервиев + ленивый столбец
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Как прокрутить ленивый столбец, когда называется мягкая клавиатура?
    Anonymous » » в форуме Android
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как прокрутить ленивый столбец, когда называется мягкая клавиатура?
    Anonymous » » в форуме Android
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как прокрутить ленивый столбец, когда называется мягкая клавиатура?
    Anonymous » » в форуме Android
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • 24-часовой формат с таймером
    Anonymous » » в форуме Jquery
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous

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