android adapter.submitData 后的第 3 行分页未执行
android paging 3 line after adapter.submitData doesn't get executed
我目前正在学习 Paging 3 库。我有一个应用程序,它有微光占位符用于在加载数据时显示。当我获得数据时,我想隐藏微光布局并显示回收器视图。
lifecycleScope.launch {
quoteViewModel.getQuotes2().collectLatest {
binding.shimmerLayout.visibility = View.GONE // this line gets executed when view created and it causes shimmer layout to hide
binding.homeRecyclerView.visibility = View.VISIBLE
homeAdapter.submitData(it)
Log.d("mytag", "after submit data") // this line isn't executed
}
}
这里的问题是 submitData
之后的那一行没有得到 executed.I 搜索并看到原因是因为 submitData
从来没有 returns 所以它没有得到叫。但是我没有找到任何示例代码。有人可以告诉我解决这个问题的示例代码吗?
我想在submitData之后执行的逻辑是隐藏shimmerLayout并显示recyclerView,但是因为那个逻辑是在提交数据之前,所以它们是立即执行的,所以加载数据时似乎没有shimmerLayout。
如您所说,submitData()
之后的行确实不会被执行,因为它没有 return。您在这里使用 Paging 3
到底想达到什么目的?
我有一个类似的疑问,我的 recyclerview
没有更新从 Paging 3
获取的数据,因为我使用的是 collect
运算符。 Dustin Lam
,Paging 3
库的作者回答我 将 collect
替换为 collectLatest
,这为我解决了问题。
在您的情况下,您已经在使用 collectLatest
。一种快速解决方法是将 submitData
放在 collectLatest
的最后,因为这是导致问题的原因。
如 collectLatest
定义中所述,
Terminal flow operator that collects the given flow with a provided action. The crucial difference from collect is that when the original flow emits a new value then the action block for the previous value is cancelled.
请注意,将 collect
替换为 collectLatest
只解决了我的问题,因为最初我的 StateFlow
是 emitting
和 Initial
状态,但是当数据已准备就绪,它发出了 Success
状态,collect
运算符未收集该状态,因为 submitData
从未 returns,但 collectLatest
强制要取消先前的操作块并收集新值。
我不确定您的问题是否有解决方案,但您可以使用确切的 use case
编辑您的问题,或者如果您找不到任何替代方案,您可以直接询问 Dustin Lam
就像我一样:)
我试过:submitData(lifecycle, it)
,它开始停在 Submit
之后的行上。
Here says:警告:直到 PagingSource 无效或适配器的刷新方法被调用,submitData() 方法才会暂停并且不会 return。这意味着 submitData() 调用之后的代码执行时间可能比您预期的要晚得多。
我目前正在学习 Paging 3 库。我有一个应用程序,它有微光占位符用于在加载数据时显示。当我获得数据时,我想隐藏微光布局并显示回收器视图。
lifecycleScope.launch {
quoteViewModel.getQuotes2().collectLatest {
binding.shimmerLayout.visibility = View.GONE // this line gets executed when view created and it causes shimmer layout to hide
binding.homeRecyclerView.visibility = View.VISIBLE
homeAdapter.submitData(it)
Log.d("mytag", "after submit data") // this line isn't executed
}
}
这里的问题是 submitData
之后的那一行没有得到 executed.I 搜索并看到原因是因为 submitData
从来没有 returns 所以它没有得到叫。但是我没有找到任何示例代码。有人可以告诉我解决这个问题的示例代码吗?
我想在submitData之后执行的逻辑是隐藏shimmerLayout并显示recyclerView,但是因为那个逻辑是在提交数据之前,所以它们是立即执行的,所以加载数据时似乎没有shimmerLayout。
如您所说,submitData()
之后的行确实不会被执行,因为它没有 return。您在这里使用 Paging 3
到底想达到什么目的?
我有一个类似的疑问,我的 recyclerview
没有更新从 Paging 3
获取的数据,因为我使用的是 collect
运算符。 Dustin Lam
,Paging 3
库的作者回答我 collect
替换为 collectLatest
,这为我解决了问题。
在您的情况下,您已经在使用 collectLatest
。一种快速解决方法是将 submitData
放在 collectLatest
的最后,因为这是导致问题的原因。
如 collectLatest
定义中所述,
Terminal flow operator that collects the given flow with a provided action. The crucial difference from collect is that when the original flow emits a new value then the action block for the previous value is cancelled.
请注意,将 collect
替换为 collectLatest
只解决了我的问题,因为最初我的 StateFlow
是 emitting
和 Initial
状态,但是当数据已准备就绪,它发出了 Success
状态,collect
运算符未收集该状态,因为 submitData
从未 returns,但 collectLatest
强制要取消先前的操作块并收集新值。
我不确定您的问题是否有解决方案,但您可以使用确切的 use case
编辑您的问题,或者如果您找不到任何替代方案,您可以直接询问 Dustin Lam
就像我一样:)
我试过:submitData(lifecycle, it)
,它开始停在 Submit
之后的行上。
Here says:警告:直到 PagingSource 无效或适配器的刷新方法被调用,submitData() 方法才会暂停并且不会 return。这意味着 submitData() 调用之后的代码执行时间可能比您预期的要晚得多。