2016-04-12 1 views
4

Хит немного блокпоста и интересно, как его решить, кажется, что курица и яйцо для меня могут сделать со свежей парой глаз.Показать различные viewType в RecyclerView на основе информации в базе данных?

У меня есть база данных с информацией о местах в них. Я хочу показать все места, упорядоченные по расстоянию в моем RecyclerView.

Я действительно сделал это уже, когда есть только один viewType. Однако это то, что я не могу понять, я хочу показать другое представление для мест, находящихся на определенном расстоянии от пользователя. Так, например, в пределах 100 метров.

Эта информация находится в моей базе данных, поэтому, когда getItemViewType(int position) вызывается на setAdapter(), мой CursorLoader не закончил вынимать всю информацию, поэтому я получаю исключение из нулевого указателя.

На мой вопрос:

Есть ли способ для меня, чтобы ждать, пока мой CursorLoader закончить затем работать с моим адаптером и не иметь нуль Cursor? Когда я пытаюсь позвонить .setAdapter() после завершения загрузки, я получаю следующее в своих журналах: No adapter attached; skipping layout, потому что RecyclerView необходимо, чтобы адаптер устанавливался при создании действия.

Мои getItemViewType(position) в настоящее время выглядит следующим образом:

if (!cursor.isClosed()) { 
    cursor.moveToPosition(position); 
} 
if (cursor.getInt(2) <= 100) { 
    return TYPE_NEARBY; 
} else { 
    return TYPE_NOT_NEARBY; 
} 

По сути, мне нужно использовать данные в моем CursorLoader определить viewType и загрузить другой вид для этой ячейки. С одним ViewType это работает, потому что мне не нужно проверять расстояние, они все одинаковы.

Спасибо за любую помощь, которую вы можете предложить!

+1

'getItemViewType' не следует вызывать, если' getItemCount' возвращает '0', что должно иметь место, если ваш курсор равен NULL. – Blackbelt

+0

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

ответ

0

Получил эту работу в конце благодаря комментариям о черных поясах.

Происходит процесс в режиме отладки, и все работает так, как ожидалось. Я просто должен был убедиться, что делаю правильные вещи с данными в моем onBindViewHolder(int position).

Основная проблема заключалась в том, что в моем ViewHolder у меня был «holderId» int, который отличался от моего типа viewType, поэтому я, вероятно, просто смутил их.

Смежные вопросы