Адаптер Android с заголовками разделов: проблемы с производительностью

У меня есть собственный адаптер для отображения списка элементов с заголовками разделов. Я просмотрел SeparatedListAdapter Джеффа Шарки. и CommonsWare MergeAdapter в качестве примеров того, как этого добиться, и теперь у меня есть решение который работает, предоставляя отдельный адаптер для содержимого каждого раздела.

Однако это создает большую проблему с производительностью. В моем случае в списке потенциально могут быть тысячи элементов, каждый из которых имеет связанную дату, и я хочу использовать дату в качестве заголовка раздела для всех элементов с этой датой.

Таким образом, без заголовков разделов у меня был бы один курсор, который возвращает элементы, отсортированные по дате. Легко и приятно.

С заголовками разделов я сейчас делаю это:

  1. Один курсор для выбора всех отдельных дат в наборе данных
  2. Для каждой отдельной даты отдельный курсор для возврата элементов, соответствующих этой дате.
  3. Залейте даты (заголовки разделов) и отдельные SimpleCursorAdapters для элементов каждой даты в мой пользовательский адаптер.

Это требует создания гораздо большего количества запросов к базе данных и курсоров, чем я хочу, и есть задержка в несколько секунд, прежде чем появится ListView.

Я подозреваю, что может быть более простое решение, когда getView делает что-то умное и определяет, когда дата изменилась между последовательными элементами, а затем сам пробирается в новый заголовок, поэтому требуется только один курсор. Может ли кто-нибудь предложить способ сделать это?


person Graham Borland    schedule 19.11.2010    source источник


Ответы (2)


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

person Timo Ohr    schedule 19.11.2010

Вы можете попробовать http://code.google.com/p/android-section-list/, для которого требуется только один курсор позади (возврат курсора + раздел в одном объекте). Однако в любом случае ему придется пройти через все элементы (один раз), чтобы вычислить размер результирующего списка + заголовки (необходимые для адаптера списка), поэтому он все еще может быть медленным.

person Jarek Potiuk    schedule 13.06.2011