【问题标题】:ViewModel returns ArrayList size as zeroViewModel 返回 ArrayList 大小为零
【发布时间】:2018-11-13 13:34:53
【问题描述】:

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

【问题讨论】:

    标签: android kotlin android-viewmodel android-paging


    【解决方案1】:

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

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

    关于占位符的PagedList documentation 状态:

    占位符

    PagedList 有两种方式可以表示它的尚未加载 数据 - 有或没有 null 占位符。

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

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

    【讨论】:

    • 但问题是日志语句只打印一次,值为 0,我也在 RecyclerView 中看到了数据。
    • 它只打印一次,因为您只收到一次列表。该列表本身将稍后填充。
    • 您能否提供解决方案。我有点卡在这里超过 2 天。
    • 可能有点超出范围。看看this blog post 或尝试用谷歌寻找类似的东西。可能已经有它的库了。
    • 谢谢,链接有帮助。
    【解决方案2】:

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

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

    如果您总是得到空列表而不是问题出在其他地方,可能是在您提取数据并将其添加到列表时的地方。

    【讨论】:

    • 我正在获取列表并显示数据。但是 studentDataPagedList 的大小始终为零。
    【解决方案3】:

    我能够使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多