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 发送有关更新/更改的信号)。
如果您想监听onInserted
、onChanged
或onRemoved
事件,您可以执行以下操作:
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,为啥?