ViewModel返回ArrayList大小为零

时间:2018-11-13 13:34:53

标签: android kotlin android-viewmodel android-paging

我正在使用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

3 个答案:

答案 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