Дано: некий 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 лишний раз, а только для обновленых элементов?