3

我正在使用 AndroidPaging库从我的RecyclerView. 我能够正确查看数据,但是当我打印列表的大小时,它返回零。

以下是我的代码:

val itemViewModel =
                ViewModelProviders.of(this, MyViewModelFacotry(disciplineId, schoolId, yearId)).get(StudentInfoViewModel::class.java)
        activity?.let {
            itemViewModel.itemPagedList.observe(it, Observer<PagedList<StudentData>> { studentDataPagedList ->
                if(BuildConfig.DEBUG){
                    Log.i("MainActivity",studentDataPagedList?.size.toString())
                }
                studentInfoNameAdapter?.submitList(studentDataPagedList)
            })

            recyclerView.adapter = studentInfoNameAdapter
        }

Log语句始终打印为零。我想显示一个TextViewif 列表为空,但列表始终返回大小为零。

4

3 回答 3

1

当您第一次收到时,如果作为配置提供,PagedList它可能是空的。setEnablePlaceholders(false)如果您想要或可以处理null值,您可以启用占位符。如果还没有数据,您可能需要研究不同的方法。

您可以使用自定义实现包装您的适配器,该实现正确委派数据集更改并在原始适配器没有项目时显示单个项目。

PagedList 文档说明了占位符:

占位符

PagedList 可以通过两种方式表示其尚未加载的数据 - 使用或不使用null占位符。

使用占位符,PagedList 始终是数据集的完整大小。get(N)返回N数据集中的第一项,或者null如果尚未加载。

如果没有null占位符,PagedList 是已加载数据的子列表。PagedList 的大小是当前加载项的数量,并get(N)返回第Nth 个加载项。这不一定是N数据集中的第一项。

于 2019-01-14T14:56:08.107 回答
0

Log 语句始终打印为零。如果列表为空,我想显示一个 TextView,但列表始终返回大小为零。

如果列表为空,则其大小应为零,因此这是正确的行为。

如果您一直得到空列表,那么问题出在其他地方,可能在您提取数据并将其添加到列表中的地方。

于 2019-01-11T11:55:36.377 回答
-1

我能够使用RecyclerView.AdapterObserver如下所示显示空状态:

初始化并注册 AdapterObserver

        val adapterDataObserver = object : RecyclerView.AdapterDataObserver() {

        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            super.onItemRangeInserted(positionStart, itemCount)
            showEmptyState(myAdapter.itemCount == 0)
        }

        override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
            super.onItemRangeRemoved(positionStart, itemCount)
            showEmptyState(myAdapter.itemCount == 0)
        }
    }
       myAdapter.registerAdapterDataObserver(adapterDataObserver)

另外,不要忘记取消注册 AdapterObserveronDestroy()

于 2019-01-16T10:58:07.423 回答