CursorAdapter вызывает bindView для каждого элемента - PullRequest
1 голос
/ 05 октября 2010

Я использовал некоторый код из DeskClock и обнаружил, что когда я пытался изменить CursorAdapter, вызывался newView для каждого элемента.(Я действительно хотел добавить разделитель, и кажется, что добавлять разделители по отдельности лучше, чем добавлять их в один listView)

Если у меня есть 3 элемента, я получаю следующее поведение:

 newView - called with item: 0
  bindView - called with item: 0
  bindView - called with item: 1
  bindView - called with item: 2
  bindView - called with item: 0
 newView - called with item: 1
  bindView - called with item: 1
 newView - called with item: 2
  bindView - called with item: 2
 newView - called with item: 0
  bindView - called with item: 0
  bindView - called with item: 1
  bindView - called with item: 2

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

Является ли это каким-то странным поведением переработчика (иликак-то нормально / ожидаемо)?Или что-то не работает с кодом (я удалил все, кроме ListView, и он все еще делает это)?Я не совсем уверен, почему вы пытаетесь связать представления, которые еще не были созданы, и почему newView вызывается по первому элементу дважды.

Спасибо!

Кстати, если кто-топростой способ добавления разделителей в ListViews, которые я хотел бы знать.Я собирался попытаться покопаться в примере контактов, чтобы увидеть, как они это делали, если нет.


Кстати, на случай, если кому-то интересно, MergeAdapter был хорош, чтобы возиться и попробовать (я буду использоватьэто в некоторых других ситуациях).Но я только что написал один адаптер, который обрабатывает несколько представлений.Он вычисляет тип каждого элемента (который является небольшим), сохраняет его на карте, инициализирует его при создании адаптера и обновляет его в notifyDataSetChanged.

Затем вам просто нужно, чтобы getViewTypeCount () возвращал числовозможные взгляды.И getItemViewType возвращает тип из карты (который основан на 0, поэтому 0-getViewTypeCount ()).Если вы можете вычислить свой тип из положения, карта вам не нужна, но сделать это на лету было невозможно, поэтому я просто предварительно / заново вычисляю при необходимости.

Ответы [ 3 ]

3 голосов
/ 31 августа 2011

У меня была та же проблема, когда bindView вызывался несколько раз (3, если быть точным) для каждой записи в моем курсоре. Исправление, которое я нашел, состояло в том, чтобы переключить мой макет на Относительный макет следующим образом:*

Раньше я использовал LinearLayout и не мог заставить его работать.Единственный способ вызвать bindView один раз для каждой строки с помощью LinearLayout - установить фиксированную высоту для ListView.Поскольку практически любой LinearLayout может быть воссоздан с помощью RelativeLayout, вы сможете просто переключить два, а затем просто сказать интерфейсу пользователя, где разместить каждый элемент.Я до сих пор не понимаю, почему мы должны это делать, и большую часть дня я потратил на выяснение проблемы, но, по крайней мере, теперь она решена.Я действительно удивлен, что больше людей не видели проблему.

2 голосов
/ 05 октября 2010

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

Вы переопределили getViewTypeCount() и getItemViewType()?

Это какое-то странное поведение переработчика (или как-то нормальное / ожидаемое)?Или что-то не работает с кодом (я удалил все, кроме ListView, и он все еще делает это)?

Что-то определенно кажется странным.

Кстати, если у кого-то естьпростой способ добавления разделителей в ListViews, которые я хотел бы знать.Я собирался попытаться покопаться в примере контактов, чтобы увидеть, как они это сделали, если нет.

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

Например, мой MergeAdapter может использоваться для разделителей, где каждый кусок материала между разделителями может бытьсодержится в своем собственном ListAdapter.Это отлично работает для некоторых сценариев.Однако предположим, что разделитель действительно определяется столбцом (например, категорией) из запроса к базе данных.Выполнение большого количества подзапросов для каждой категории для переноса каждого Cursor в его собственный SimpleCursorAdapter для использования MergeAdapter было бы болезненным.Лучше было бы создать другой вид переноса Adapter, который может вставлять заголовки на лету на основе обнаруженных изменений в значении категории.У меня нет образца такого Adapter под рукой, хотя он есть в моем списке дел на 18 000 пунктов ...

0 голосов
/ 15 ноября 2013

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

cursor.getPosition();
...