- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 PagedListAdapter 并且必须在屏幕恢复时重新加载数据。
对于这种情况,我不想在加载数据时清除适配器并将其显示为空或占位符。
我想显示以前的数据,并在收到新数据后用差异更新它。
但是现在,当我执行 dataSource.invalidate()
时,它会立即提交一个空列表,这会导致清除适配器并显示占位符。
现在我的代码是这样的:
class PortfolioListDataSource(
private val viewModel: PortfolioViewModel,
private val tabType: PortfolioTabType
) : PageKeyedDataSource<Int, Investment>() {
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, Investment>) {
val offset = 0
viewModel.loadInvestments(tabType, offset, Consumer {
val nextKey = if (it.data.size < params.requestedLoadSize) null else it.data.size
callback.onResult(it.data, offset, it.total, null, nextKey)
})
}
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Investment>) {
val offset = params.key
viewModel.loadInvestments(tabType, offset, Consumer {
val nextKey = offset + it.data.size
callback.onResult(it.data, nextKey)
})
}
override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Investment>) {
}
class Factory(
val viewModel: PortfolioViewModel,
private val tabType: PortfolioTabType
) : DataSource.Factory<Int, Investment>() {
val sourceLiveData = MutableLiveData<PortfolioListDataSource>()
override fun create() = PortfolioListDataSource(viewModel, tabType)
.also { sourceLiveData.postValue(it) }
}
}
这里我初始化
val pagedListConfig = PagedList.Config.Builder()
.setInitialLoadSizeHint(20)
.setPageSize(20)
.build()
ordersLiveData = LivePagedListBuilder(factory, pagedListConfig).build()
这里我填充适配器
viewModel.ordersLiveData.observe(this, Observer {
adapter.submitList(it)
})
并用
刷新它// TODO Here I want to fetch new data, but not invalidate current dataset while it is loading
factory.sourceLiveData.value?.invalidate()
如何保留以前的数据并在新数据准备就绪时更新它?
更新:
我想要这样的东西:
if (!refreshing) {
submitList(it)
}
我的意思是在调用 dataSource.invalidate()
时不将空数据集发布到适配器。
我知道上面提到的示例将不起作用,因为一旦提交,数据源就会将更新传递给列表的同一实例,并且它是完全封装的。
此外,我对数据集本身没有影响。
我尝试使用 PagedList.Callback
它可以让我们知道列表何时更新。但同样,没有机会以某种方式影响更新行为。
对于常规适配器,在收到新数据之前,我不会设置或更新它的项目。我想在这里实现类似的目标。
最佳答案
是的,invalidate() 将清除当前数据集。因此,您将进入加载/占位符状态。也无法更新特定页面。比如说,你在第 5 页,你想更新该特定页面中的数据。如果不调用 invalidate() 也是不可能的,这将清除数据集并将 Recyclerview 带到第一页(列表顶部)。
摆脱所有这些问题的唯一方法是在 Room 中引入一个持久层。 https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample#paging-with-database-and-network
根据此处的文档: https://developer.android.com/reference/androidx/paging/DataSource#updating-paged-data
If you have more granular update signals, such as a network API signaling an update to a single item in the list, it's recommended to load data from network into memory. Then present that data to the PagedList via a DataSource that wraps an in-memory snapshot. Each time the in-memory copy changes, invalidate the previous DataSource, and a new one wrapping the new state of the snapshot can be created.
https://developer.android.com/topic/libraries/architecture/paging/data#consider-content-updates
As you construct observable PagedList objects, consider how content updates work. If you're loading data directly from a Room database updates get pushed to your app's UI automatically.
在您的情况下,您始终可以在屏幕恢复时从数据库加载数据,直到从您的 API 获取数据。
关于android - PagedListAdapter 重新加载没有占位符的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398072/
我尝试使用以下 json,但 wiremock 无法识别我的更改。我看了wiremock的文档,看到他们说:JSON相等匹配是基于JsonUnit的,因此支持占位符。我也尝试使用 JDK 8 和 JD
我发现这种方法可以使用 mixin 轻松添加 @media block : @mixin phone() { @media only screen and (max-width: 480px)
我有四个依赖的选择列表,我想给所有选择列表一个默认值/占位符,如下所示:select ... 。问题是,当我尝试这样做时: Select ... 它不起作用。因为当我更改第一个选择列表时,其他选择列表
所以我只是浏览我们的库存管理系统的代码我看到了我一位同事的一些片段,他在某些功能中所做的只是例如,只需打开它们并在其中插入命令 procedure TWerkStF.TBBtnStatiClick(S
因此,对于我当前的 Bukkit(Minecraft)插件,我必须使用 ItemStacks 的名称。我通过这样做得到这些名字 item.getItemMeta().getDisplayName();
我想为 JAVA 开发一个猜词游戏,但在开发 GUI 时遇到了一些困难。我并不是想开发一个仅使用一个文本字段的简单 GUI,我想开发一个更像移动设备的 GUI。因此,我希望白框显示为单词中字符的占位符
我想测试输出是否如下所示: String s1 = "You have 5 Dollar in your bank account." 要通过测试,字符串需要相等,所以我需要一个相等的字符串: Str
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我一直在使用 JavaScript 占位符脚本来支持 IE 占位符。 适用于输入类型 = 文本。但是我该如何在脚本中添加一个支持 textarea 的内容呢? 我的代码是: function acti
我正在寻找一个正则表达式,它可以正确检测字符串中是否存在 printf() 类型的占位符。 最佳答案 事实证明这比看起来要复杂一些,答案取决于您想对占位符做什么,以及您对 printf 和正则表达式使
注意占位符在 Stackoverflow 提问标题和 Twitter 注册表单上的工作方式:https://twitter.com/signup 占位符有两种状态: 未选择(显示占位符) 已选择,但有
我想将"template"文件的输出通过管道传输到 MySQL,该文件散布着 ${dbName} 等变量。替换这些实例并将输出转储到标准输出的命令行实用程序是什么? 输入文件被认为是安全的,但可能存在
我有一个像这样的js数组: let data = [{status:"stay",points:[1,2,3,4,5]}, {status:"move",points:[1,2,3,4,5]},{st
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Show default value for editing on Python input possible? 我
我正在尝试使用 python format 方法将我的占位符格式化为字符串。 问题是字符串内部包含 {} 并且字符串方法无法解析它。 my_value='v' '{"k":"{value}"}'.fo
我正在使用 PHP + CodeIgniter 构建一个多语言应用程序。我决定使用 gettext 进行 UI 文本翻译,到目前为止,它已被证明高效且易于使用。 但现在我遇到了一些非常烦人的事情:ge
我有一个 NSAttributedString 看起来像 “一些字符串 bold %@ template %f %d blah blah blah” 我希望能够像 [NSString stringWi
我喜欢偶尔为占位符使用空函数(主要是空构造函数,因为它有助于避免构造函数的意外重复,因为我的团队知道必须始终有一个构造函数)。 我还喜欢对一个类的每个方法至少进行一次测试(主要是因为这是一个很好的简单
我正在尝试向 Angular 4 上的选择添加占位符,但无法使其正常工作, 这是我的代码: Please select one option {{ select
有没有办法在 sqlite3 中设置查询的占位符?我有一些与数据库一起工作的函数,如果它们可以同时与 mysql 和 sqlite 一起工作,那就更令人满意了。Mysql 和 Postgres pyt
我是一名优秀的程序员,十分优秀!