Списки С Разными Типами Элементов И Разными Поставщиками Данных



Предисловие Однажды мне понадобилось отображать в одном ListView карточки разных типов, да ещё полученные с сервера по разным API. Мол, пусть пользователь порадуется и увидит в одной ленте новостей:

  • видеокарты с тамнамами и описаниями;
  • карточки авторов или теги, с большой кнопкой «подписаться».

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



Списки с разными типами элементов и разными поставщиками данных

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



Списки с разными типами элементов и разными поставщиками данных

Ну а чтобы жизнь медом не казалась, API сервера изменить нельзя.



От API к ListView

Вирджил Добьянски Google Ввод/Вывод 2010 г.

прекрасно объяснил, как реализовать взаимодействие с REST API. Самый первый шаблон гласит:

  1. Действие создает Службу, которая отправляет запрос к REST API;
  2. Сервис анализирует ответ и сохраняет данные в базу данных через ContentProvider;
  3. Activity получает уведомление о том, что данные изменились, и обновляет представление.

УПД Тут возник небольшой холивар на тему использования сервиса, поэтому лучше это слово заменить на «библиотека, реализующая HTTP-запросы» — неважно каким образом.

Вот как всё работает в итоге: делаем кучу запросов к API, вставляем данные с помощью ContentProvider в отдельные таблицы, связанные с типами ресурсов REST, и уведомляем с помощью notifyChange о наличии новых данных в фиде.

Но, как обычно, есть две проблемы:

  • Как правильно отобразить список карт?
  • Как собрать запрос на фид?


Отображение разных типов карт

Для начала разберемся с тем, что проще.

Решение легко найти в Google, поэтому приведу его кратко.

В адаптер список карточек мы переопределяем методы:

   

@Override int getViewTypeCount() {

Теги: #Android #union #merge #ListView #ContentProvider #CursorAdapter #MergeCursor #Разработка для Android
Вместе с данным постом часто просматривают: