【问题标题】:Room DataSource.Factory with multiple view RecyclerViewRoom DataSource.Factory 与多视图 RecyclerView
【发布时间】:2020-02-24 22:51:09
【问题描述】:

我在 DAO 上有以下 SELECT

@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();

Fragment 只是观察上述todos 并在新更新时调用adapter.submitList(items)

我最近才切换到使用androidx.paging,然后才获取所有数据并用它填充RecyclerView

上面的代码可以正常工作。问题是我需要支持多个视图。更准确地说,我需要在具有该日期的第一个元素之上添加日期。在升级之前,我循环这些项目并在需要的地方添加 DateHeader 项目(并在适配器中处理多种视图类型),但是使用这种新方法我无法编辑 DataSource.Factory 提供的内容。

不能使用ItemDecoration 或在每个项目中添加日期并更改其可见性。

我也将日期保存在数据库中,因此我可以group by 并通过date 获取项目计数,如果这有帮助的话。

有没有办法解决这个问题?仅供参考,这里没有网络通信,一切都是本地的,只保存在数据库中。

【问题讨论】:

    标签: android mvvm android-recyclerview androidx android-paging


    【解决方案1】:

    目前似乎不支持向 DAO 的 DataSource.Factory 返回的列表中添加其他项目。

    由于我只需要在第一个项目的顶部添加日期,因此我最终使用 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 一样工作,具有多种类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多