【问题标题】:LiveData Paged List size is always 0LiveData 分页列表大小始终为 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>

【问题讨论】:

    标签: android android-livedata android-mvvm android-paging android-paging-library


    【解决方案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()

    【讨论】:

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