@Vermut756

Правильно ли я понимаю Adapter, notifyDataSetChanged и назначение паттерна ViewHolder?

Дано: некий ArrayList с несколькими объектами одного типа, и Adapter, унаследованный от ArrayAdapter, который презентит эти объекты в ListView.

Требуется: реализовать обновление конкретного объекта, и соответственно обновление соответствующего View в ArrayAdapter.

Я это делал так:
arrayList.get(...).setMyProperty(...);
adapter.NotifyDataSetChanged();


Правда, сначала почему-то не работало - View не обновлялись.
Я подумал, что это из-за того, что адаптер как-то сравнивает объекты, а в них нет корректного механизма сравнения, не обнаруживает изменений и не обновляет соответствующий View, и надо в этих объектах реализовать что-то вроде hashCode, equals или comparable, тогда он будет работать правильно.

Но я нашел решение проще - в свою реализацию ArrayAdapter просто добавить следующее:
@Override
    public int getCount() {
    	return values.size();
    }


В результате элемент стал обновляться.
Но ведь у меня по-прежнему нет механизма сравнения, значит, при обновлении одного элемента тупо будет вызываться getView() для всех элементов.

Я правильно понимаю что это так будет? (чуть позже проверю, просто пока элемент всего 1)

Если понимаю правильно, то нормально ли это, или можно (нужно) как-то реализовать сравнение, чтобы getView вызывался только для вьюшек обновленных объектов?

Еще, как я понимаю, есть паттерн ViewHolder, который позволяет в этом случае избавиться от inflate() и findViewById() при каждом обновлении каждого элемента, тем самым хоть и не отказаться от getView для всех элементов, но оптимизировать его.
Но разве не лучше чтобы вообще не вызывать getView лишний раз, а только для обновленых элементов?
  • Вопрос задан
  • 1015 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Конечно лучше. Но в листвью нет возможности без костылей это сделать. Да листвью и не надо использовать, берите сразу RecyclerView. Там есть набор методов именно таких, какие вы хотите. А листвью забудьте просто.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы