Size: a a a

Javanese Questions

2018 March 25

Н

Никита ✓ in Javanese Questions
Ula ☝
всем привет. нужна помощь. в каждом listview item нужно показывать countdowntimer таймер обратного отсчета. я попробовал использовать cursoradapter, arrayadapter но все равно не получается показывать таймер праильно, чтобы каждый считал для своего элемента свой счет. как можно достичь этого?

p.s. https://play.google.com/store/apps/details?id=com.timeanddate.countdown
вот такого типа приложение я делаю
Тут не экстрасенсы.
источник

Н

Никита ✓ in Javanese Questions
Дай код
источник

ИМ

Игорь Марков in Javanese Questions
Ula ☝
всем привет. нужна помощь. в каждом listview item нужно показывать countdowntimer таймер обратного отсчета. я попробовал использовать cursoradapter, arrayadapter но все равно не получается показывать таймер праильно, чтобы каждый считал для своего элемента свой счет. как можно достичь этого?

p.s. https://play.google.com/store/apps/details?id=com.timeanddate.countdown
вот такого типа приложение я делаю
Буквально сейчас сижу точно такое же делаю. Имею модель List<Video> в адаптере. Сделал массив такого же размера, и метод кот. считает новый текст (обновляется в таймере). Таймер запускаю один (fragment onResume -> adapter.startTimer(), onPause->adapter.stopTimer()). Таймер работает в ui thread, пробегаю по всему листу, обновляю тексты, если он реально обновился, делаю notifyItemChanged(currPosition)
У меня правда recylerView, в listView вроде нету notifyItemChanged, но там я помню что-то похожее было
источник

U☝

Ula ☝ in Javanese Questions
Игорь Марков
Буквально сейчас сижу точно такое же делаю. Имею модель List<Video> в адаптере. Сделал массив такого же размера, и метод кот. считает новый текст (обновляется в таймере). Таймер запускаю один (fragment onResume -> adapter.startTimer(), onPause->adapter.stopTimer()). Таймер работает в ui thread, пробегаю по всему листу, обновляю тексты, если он реально обновился, делаю notifyItemChanged(currPosition)
У меня правда recylerView, в listView вроде нету notifyItemChanged, но там я помню что-то похожее было
т.е. у вас один таймер на все айтемы?
источник

Н

Никита ✓ in Javanese Questions
Игорь Марков
Буквально сейчас сижу точно такое же делаю. Имею модель List<Video> в адаптере. Сделал массив такого же размера, и метод кот. считает новый текст (обновляется в таймере). Таймер запускаю один (fragment onResume -> adapter.startTimer(), onPause->adapter.stopTimer()). Таймер работает в ui thread, пробегаю по всему листу, обновляю тексты, если он реально обновился, делаю notifyItemChanged(currPosition)
У меня правда recylerView, в listView вроде нету notifyItemChanged, но там я помню что-то похожее было
А зачем его останавливать в onStop?
источник

ИМ

Игорь Марков in Javanese Questions
Ula ☝
т.е. у вас один таймер на все айтемы?
таймер один, я не хотел даже связываться с управлением таймера при recycling. По идее ничего сложного, там просто посмотреть надо, в любом случае один таймер проще чем смотреть что с ним будет, как его переопределять или стопать или item уйдет в recycling
источник

ИМ

Игорь Марков in Javanese Questions
Никита ✓
А зачем его останавливать в onStop?
останавлию в паузе фрагмента, т.к. таймер обновялет текст на ui, зачем его держать если из фрагмента мы уходим?
И останавлию не в onStop а в onPause
источник

Н

Никита ✓ in Javanese Questions
Игорь Марков
останавлию в паузе фрагмента, т.к. таймер обновялет текст на ui, зачем его держать если из фрагмента мы уходим?
И останавлию не в onStop а в onPause
Погоди. А если каждому айтему своё время будет? Не совсем понятно что ты делаешь. Скорее всего ему не поможет это
источник

U☝

Ula ☝ in Javanese Questions
Никита ✓
Погоди. А если каждому айтему своё время будет? Не совсем понятно что ты делаешь. Скорее всего ему не поможет это
вот мне как раз это и нужно
источник

ИМ

Игорь Марков in Javanese Questions
Никита ✓
Погоди. А если каждому айтему своё время будет? Не совсем понятно что ты делаешь. Скорее всего ему не поможет это
так так и есть. Есть list<video>, там время по кот. мне надо посчитать. Я в цикле в таймере считаю и делаю update если надо обновить
источник

ИМ

Игорь Марков in Javanese Questions
private class UpdateTimerTask extends TimerTask {
       private List<Integer> updatePositions = new ArrayList<😠);
       @Override
       public void run() {
           uiHandler.post(() -> {
               updatePositions.clear();
               for (int i = 0; i < video.size(); ++i) {
                   if (updateText(i)) {
                       updatePositions.add(i);
                   }
               }
               for (int position : updatePositions) {
                   notifyItemChanged(position);
               }
           });
       }
   }
источник

ИМ

Игорь Марков in Javanese Questions
updateText по индексу обновялет текст, слаживает его в String[], он там в классе висит и возр. true если тексты был обновлен (ну чтобы лишние апдейты не вызывать)
источник

ИМ

Игорь Марков in Javanese Questions
updatePositions накапливает эти индексы и потом мы передаем это адаптеру чтобы он обновил по индексам. Если item recycled и не видим, то адаптер со списком там сами разберутся
источник

ИМ

Игорь Марков in Javanese Questions
ну т.е. если item 0 был обновлен, а у нас сейчас показываются от 100 по 105
источник

ИМ

Игорь Марков in Javanese Questions
Тут идея в том, что если бы списки не ресайклили свои items, то мы бы запустили 100 таймер на 100 элементов и все. а так пользователь крутит список, item, например, 0, становится Item 10 и нам надо управлять таймером чтобы это все обновить (т.к. теперь таймер будет работать с 10 элементом модели вместо 0). А если мы имеем один таймер, мы просчитываем всю модель и передаем адаптеру что мы хотим обновить, а он пусть там сам смотрит, видим данный элемент, не видим, надо вызывать реальное обновление (onBindViewHolder) или нет. Ну тут опять recyclerView, но в listView тоже самое
источник

ИМ

Игорь Марков in Javanese Questions
Сейчас доделал, заценил, да, так и есть, все хорошо и красиво
источник

U☝

Ula ☝ in Javanese Questions
у меня сейчас такая ситуация. я использую кусорадаптер и в bindview создаю таймер для каждого элемента листвью. но в приложении получается так, что каждый элемент показывает (иногда не показывает) все существующие таймеры очень очень быстро. когда скролишь особенно заметно

https://play.google.com/store/apps/details?id=com.timeanddate.countdown

мне нужно получить вот такой результат
источник

U☝

Ula ☝ in Javanese Questions
я попробовал сохранять таймеры в SparseArray<😠)
countDownCounters.put(cardView.hashCode(), countDownTimer);

вот так вот. и теперь при открытии активити он показывает у всех один таймер (который не ходит) а когда быстро скроишь вверх вниз иногда меняет значения таймера
источник

ИМ

Игорь Марков in Javanese Questions
все равно я не пойму - зачем каждому элементу отдельный таймер?
источник

ИМ

Игорь Марков in Javanese Questions
вы отгребете больше проблем при ресайклинге чем получите выгоды от этих таймеров
источник