Комната DataSource.Factory с несколькими представлениями RecyclerView - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующее SELECT в DAO

@Query("SELECT * FROM todo ORDER BY time DESC")
abstract DataSource.Factory<Integer, TodoItem> getAll();

У меня есть репозиторий, который просто возвращает вышеупомянутое. И в модели у меня есть

PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setInitialLoadSizeHint(40)
            .setPageSize(20)
            .build();

todos = new LivePagedListBuilder<>(todoRepository.getAll(), config).build();

Фрагмент просто наблюдает вышеупомянутое todos и вызывает adapter.submitList(items) при новых обновлениях.

Я только недавно переключился на использование androidx.paging, до того, как я получил все данные и заполнил им RecyclerView.

Приведенный выше код отлично работает для того, чем он является в настоящее время. Проблема в том, что мне нужна поддержка нескольких представлений. Точнее, мне нужно добавить дату поверх первого элемента с этой датой. До обновления я зацикливал элементы и, при необходимости, добавлял элементы DateHeader (и обрабатывал несколько типов представлений в адаптере), но с помощью этого нового метода я не могу редактировать то, что обеспечивает DataSource.Factory.

Использование ItemDecoration или добавление даты в каждый элемент и изменение ее видимости - не вариант.

У меня также есть дата, сохраненная в базе данных, поэтому я могу group by и получить количество элементов на date если это может помочь.

Есть ли способ решить это? Просто для справки, здесь нет сетевого взаимодействия, все локально и сохраняется только в базе данных.

1 Ответ

0 голосов
/ 26 февраля 2020

Похоже, что в настоящее время нет поддержки добавления дополнительных элементов в список, который возвращает DataSource.Factory DAO.

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

Вот запрос, может ли он кому-нибудь помочь:

select * from (
    select tDate.*, 0 as type from todos as tDate group by date having max(time) 
  UNION 
    select tItem.*, 1 as type from todos tItem
  ) as tView 
order by tView.time desc, tView.type asc

Я определил вышеупомянутый запрос как DatabaseView .

К счастью PagedListAdapter точно так же, как обычный Adapter имеет поддержку нескольких представлений, в случае, если тип 0 сверху, я печатаю элемент даты, в противном случае я печатаю обычный элемент.

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

...