Адаптер Android с заголовками разделов: проблемы с производительностью - PullRequest
0 голосов
/ 19 ноября 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

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

1 голос
/ 13 июня 2011

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

...