LiveData 分页列表大小始终为 0

Posted

技术标签:

【中文标题】LiveData 分页列表大小始终为 0【英文标题】:LiveData Paged List size is always 0 【发布时间】:2019-11-06 14:55:52 【问题描述】:

我使用 android 分页库实现了分页。 ViewModel 返回一个LiveData<PagedList<MyObject>>,我观察到在我设置适配器的片段中,一切正常,除了当我想检查列表的大小始终为 0 时。

viewModel.getSearchResults().observe(this, mList -> 
           adapter.submitList(mList);
           Log.e("Count", String.valueOf(mList.size()));
       );

其中 mList 是 PagedList<MyObject>

【问题讨论】:

【参考方案1】:

如果您查看来自PagedList 文档的Loading Data,您会注意到以下内容:

如果您使用LivePagedListBuilder 获取LiveData<PagedList>,它将在后台线程上为您初始化 PagedLists。

另外,Mutability and Snapshots 声明如下:

PagedList 在加载时是可变的,或者准备从其 DataSource 加载。随着加载成功,可变的 PagedList 将通过主线程上的 Runnables 更新。您可以通过PagedList.Callback 收听这些更新。 (请注意,PagedListAdapter 将收听这些消息以向 RecyclerView 发送有关更新/更改的信号)。

如果您想监听onInsertedonChangedonRemoved 事件,您可以执行以下操作:

viewModel.observableData.observe(viewLifecycleOwner, Observer  pagedList ->
    adapter.submitList(pagedList)
    pagedList.addWeakCallback(null, object: PagedList.Callback() 
        override fun onChanged(position: Int, count: Int) 
        override fun onInserted(position: Int, count: Int) 
            println("count: $count")
        
        override fun onRemoved(position: Int, count: Int) 
    )
)

【讨论】:

如果列表大小实际上为 0,我不会收到任何回调。我想显示无结果消息,有什么建议吗? @Ishaan 我会去建模数据源以将没有结果作为单独的对象发出信号,这样会更容易管理:考虑密封类 ListItem 数据类 Item(val model : Model) : ListItem() object NoResults: ListItem() 如果你的 loadInitial 返回空的项目列表,你可以通过 NoResults 这个回调只返回pageSizeNumber,如何返回所有的list number?【参考方案2】:

如果你使用 Rxjava3 ,

RxJava3CallAdapterFactory.create(),默认不同步。

您需要使用RxJava3CallAdapterFactory.createSynchronous()

【讨论】:

以上是关于LiveData 分页列表大小始终为 0的主要内容,如果未能解决你的问题,请参考以下文章

当列表分页的大小输入设置为大于 15 时,Spring Data PagedListHolder 没有返回正确的 PageSize,为啥?

CakePHP 2中带有分页分页类的大小为f数组的问题

反应表动态页面大小,但有大小限制和分页

调整 UICollectionViewCells 的大小以始终填充 UICollectionView

无法检测人脸,并且返回矩形大小始终为 1x0

一道操作系统题,在一个分页存储管理系统中,逻辑地址长度为16位,页面大小为4096B,现有逻辑地址2F6AH