обновить представления элемента Галерея / СписокПросмотр из таймера - PullRequest
0 голосов
/ 08 марта 2012

Я хочу обновить интерфейс пользователя по таймеру.Это совсем не проблема, но когда дело доходит до Gallery / ListViews, это становится сложным.У меня есть галерея с пользовательским BaseAdapter.Мне нужен счетчик для каждого элемента (галереи) (каждый элемент рассчитывается по-разному в зависимости от данных элементов).Этот счетчик должен работать вне основного потока.Кроме того, я не хочу запускать 10 потоков для 10 элементов галереи, когда виден только один элемент.Нетрудно определить обработчик и запустить поток (счет) в методе getView () адаптера, когда элемент / представление становится видимым.Я могу думать о чем-то вроде следующего кода:

public class MyAdapter extends BaseAdapter {</p> <pre><code> static class ViewHolder { //... public Handler myHandler; } public View getView(int position, View convertView, ViewGroup parent) { //... // getView() gets called indefinite so first remove callback because it may be added already holder.myHandler.removeCallbacks(myRunnable); holder.myHandler.postDelayed(myRunnable, 0); //... }

}

Проблема состоит в том, чтобы удалить обратный вызов для представления, которое больше не видно, потому чтов getView () меня замечают, когда вид становится видимым, но я понятия не имею, как получить вид (и, следовательно, держатель и его обработчик), который стал невидимым для удаления обратного вызова.

Есть (нет)) подход, чтобы решить это?

1 Ответ

2 голосов
/ 16 марта 2012

Нашел чистое решение (если кому-то нужно что-то подобное).Мне нужно было обновить TextView, чтобы установить новое значение счетчика (каждую секунду).

В BaseAdapters getView я добавляю TextViews в WeakHashMap.TextView является ключом карты.Отображение ключ / значение будет удалено, если на ключ больше не ссылаются.Так что я не вызываю утечки памяти.GarbageCollector выполняет свою работу.

Поток отсчитывает "встречные объекты" и обновляет TextViews с соответствующими значениями (GarbageCollector выполняется постоянно, поэтому в моем случае карта состоит в основном из 3 элементов, потому что галерея показываетодин элемент. Из-за GarbageCollection карта немедленно очищается с помощью «неиспользуемых» TextViews, особенно при быстрой прокрутке списка / галереи)

getView ():1010 *

// Thread decrementing the time of the counter objects and updating the UI
private final Runnable counterTimeTask = new Runnable() {
    public void run() {
        //...
        // decrement the remaining time of all objects
        for (CounterData data : counterDataList) 
            data.decrementTimeLeftInSeconds();

        // iterate through the map and update the containing TextViews
        for (Map.Entry<TextView, Integer> entry : counterMap.entrySet()) {
            TextView tvCounter = entry.getKey();
            Integer position = entry.getValue();
            CounterData data = counterDataList.get(position);
            long timeLeftInSeconds = data.getTimeLeftInSeconds();
            tvCounter.setText(" " + timeLeftInSeconds);
        }

        if (yourCondition)
            counterHandler.postDelayed(this, 1000);
    }
};

Запуск / остановка счетчика:

public void startCounter() { counterHandler.post(counterTimeTask); }
public void stopCounter() { counterHandler.removeCallbacks(counterTimeTask); }
...