Список AndroidПосмотреть notifyDataSetChanged - PullRequest
3 голосов
/ 05 сентября 2011

У меня есть собственный просмотр списка, каждая запись содержит вращающийся ProgressBar и однострочный текстовый просмотр. Я всегда обновляю только первый элемент в списке. Проблема в том, что каждый раз, когда я вызываю notifyDataSetChanged, все видимые представления либо воссоздаются, либо перерабатываются как convertView.

У этого подхода есть 2 проблемы:

  • все записи воссоздаются, и это медленно - и это не требуется, поскольку я обновляю только текстовое представление в первой записи

  • анимация ProgressBar перезапускается каждый раз

Так что я подумал, что я просто сохраню ссылку на первый просмотр в адаптере и обновлю ее вручную. Это сработало, но случайным образом выдает IllegalStateException («Содержимое адаптера изменилось, но ListView не получил уведомление. Убедитесь, что содержимое вашего адаптера не изменено из фонового потока, а только из потока пользовательского интерфейса.»)

Как мне это решить? Есть ли способ уведомить ListView, что изменилась только первая запись? Даже если анимация ProgressBar существует, она все равно не будет работать. Есть ли другой способ обновить его вручную?

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2011

Всякий раз, когда мне нужно обновить один элемент списка, я использую это:

public void updateItemAt(int index) {
    View v = listView.getChildAt(index - listView.getFirstVisiblePosition());
    if (v != null) {
        //updates the view
    }
}

Недостатком является то, что вам нужно хранить ссылку на listView в вашем адаптере. Поскольку этот код обычно вызывается из фоновой задачи, для его вызова необходимо использовать обработчик:

Handler myHandler = new Handler() {
    public void handleMessage(Message msg) {
        int index = msg.what;
        myAdapter.updateItemAt(index);
    };
};

//when task is complete:
myHandler.sendEmptyMessage(index);
...