我正在使用Android Paging
库从我的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
语句始终打印为零。如果列表为空,但列表始终返回大小为零,我想显示TextView
。
答案 0 :(得分:1)
首次提供PagedList
时,如果提供setEnablePlaceholders(false)
作为配置,则可能为空。如果您希望或可以处理null
值,则可以启用占位符。如果还没有数据,您可能需要研究其他方法。
您可以使用自定义实现包装适配器,该实现将数据集更改正确委派给自定义实现,并在原始适配器没有项目时显示单个项目。
PagedList documentation关于占位符的状态:
占位符
PagedList可以用两种方式表示其尚未加载 数据-带有或不带有
null
占位符。使用占位符时,PagedList始终是数据的完整大小 组。
get(N)
返回数据集中的第N
条,如果返回第null
条,则返回null
尚未加载。没有
get(N)
占位符,PagedList是数据的子列表, 已经加载。 PagedList的大小是 当前加载的项目,而N
返回第N
个加载的项目。 这不一定是数据集中的第{{1}}条。
答案 1 :(得分:0)
Log语句始终打印为零。我想显示一个TextView 列表为空,但列表始终返回大小为零。
如果列表为空,则其大小应为零,以确保其正确行为。
如果您一直都是空列表,而不是问题出在其他地方,最好是在提取数据并将其添加到列表中的地方。
答案 2 :(得分:0)
我能够使用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)
此外,不要忘记在onDestroy()
上取消注册AdapterObserver