Добро пожаловать в архитектуру утилизации!
Прежде всего, вы должны понимать, что onBindViewHolder
может вызываться несколько раз, когда представление прокручивается и отображается на экране, и вы запускаете таймер при каждом вызове.
Вам нужно сохранить оставшиеся миллисекунды таймера в onTick
в данных viewHolder и запустить таймер с этим оставшимся временем.
Обновление:
В вашем классе viewHolder используйте длинную переменную, которая показывает, сколько времени осталось для coutDown, давайте назовем ее timeLeft
. В onTick
тип метода holder.timeLeft = millisUntilFinished
и в onFinish
тип метода holder.timeLeft = -1
.
Теперь, при запуске нового таймера, после проверки таймера не устанавливается ноль,
if (holder.leftTime > 0) {
holder.newCountDownTimer = object : CountDownTimer(holder.timeLeft, 1000) {
...
}
}
Если timeLeft равен -1, решите, что делать с таймером.
Кроме того, вам может потребоваться изменить тиканье с каждых 1000 миллисекунд до меньшего числа, например 100 миллисекунд, для более точной синхронизации при сохранении holder.timeLeft
.
Надеюсь, это ответит на ваш вопрос.