草庐IT

android - DataSource.Invalidate() 之后新的 PagedList 只有一页

coder 2023-12-14 原文

我有一个带有分页的列表,它是使用 Paging 库实现的。可以修改(更改/删除)此列表中的项目。 据官方documentation ,我首先更改内存列表缓存,我的 DataSource 从中获取页面,然后调用 datasource.invalidate() 以创建新的对 PagedList/数据源:

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.

如果用户修改第一页上的项目,它会工作并且看起来很好。

但是,如果用户在 datasource.invalidate() 期间位于第二页或更远的页面,他将被扔到第一页的末尾

调试显示发生这种情况是因为新 PagedList 在提交给 PagedListAdapter.submitList 时只有第一页。 Adapter 比较新旧列表并删除所有不在第一页的项目。如果他在第一页上,它总是发生但对用户不可见。

所以对我来说,看起来新对 PagedList/DataSource 不知道获取前对的页数并且 datasource.invalidate() 不适合对于文档中的情况。我认为案例可接受的行为然后用户更新所有列表(如滑动刷新)但不是

an update to a single item in the list

有没有人遇到过这样的问题或以某种方式归档了我想要的东西?也许我遗漏了一些技巧,这些技巧可以帮助我在所有页面中获得新的 PagedList

澄清一下:库版本 2.1.0。基于内存缓存和远程服务的自定义 PageKeyedDataSource(无 Room)

最佳答案

我想分享我的研究,以防有人感兴趣:

  1. 问题(“缺乏功能”)是已知的,至少我在官方跟踪器上找到了几个相关的讨论 one two
  2. 如果您正在使用PositionalDataSourceItemKeyedDataSource,您应该从初始参数中挖掘requestedStartPosition/requestedInitialKey 的方向,如this answer说。我没有太多时间来构建整个解决方案,但这些参数对于无效后的初始加载确实不同

关于我的案例:PageKeyedDataSourceHere你可以看到在这种类型的数据源中没有类似于requestedInitialKey 的参数。尽管如此,我还是找到了一个适合我的解决方案,非常简单,尽管感觉像是一个肮脏的把戏:

invalidate() 之后调用 loadInitial() 时,内存缓存返回所有已加载的页面,而不仅仅是第一个页面。 起初我担心如果 requestedLoadSize 是 5 但结果是 50 项列表,某些东西会中断,但事实证明它只是一个提示,可以忽略。只是不要忘记传递对应于最后一个缓存页面而不是第一个页面的 nextPageKey

希望对你有帮助

关于android - DataSource.Invalidate() 之后新的 PagedList 只有一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846896/

有关android - DataSource.Invalidate() 之后新的 PagedList 只有一页的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  5. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  6. ruby - 需要重构为新的 Ruby 1.9 哈希语法 - 2

    这个问题在这里已经有了答案:HashsyntaxinRuby[duplicate](1个回答)关闭5年前。我有一个Recipe,其中包含以下未通过lint测试的代码:service'apache'dosupports:status=>true,:restart=>true,:reload=>trueend失败并出现错误:UsethenewRuby1.9hashsyntax.supports:status=>true,:restart=>true,:reload=>true不确定新语法是什么样的...有人可以帮忙吗?

  7. ruby - 为什么我不能从 ruby​​ 中的选定键创建新的散列? - 2

    这个问题困扰了我一段时间。这不是一件困难的事情,但我不知道为什么没有简单的方法来做到这一点,我敢打赌有但我没有看到。我只想取一个散列,像这样:cars={:bob=>'Pontiac',:fred=>'Chrysler',:lisa=>'Cadillac',:mary=>'Jaguar'}然后做类似的事情cars[:bob,:lisa]得到{:bob=>'Pontiac',:lisa=>'Cadillac'}我这样做了,效果很好:classHashdefpick(*keys)Hash[select{|k,v|keys.include?(k)}]endendruby-1.8.7-p249

  8. ruby - 如何将新的 rvm 安装与现有的 ruby​​ 版本相关联? - 2

    我遇到了RVM的问题,所以我卸载并重新安装了它。事实是我实际上尝试过rbenv,但这对我来说没有用,所以我试图让rvm重新启动并运行-而不必安装重复版本的Ruby。我至少安装了1个现有版本的Ruby:ruby--versionruby1.8.7(2011-12-28patchlevel357)[universal-darwin11.0]但是当我执行rvmlist时,我得到一个空白列表:bash-3.2$rvmlistrvmrubies#Defaultrubynotset.Try'rvmaliascreatedefault'.#=>-current#=*-current&&default

  9. ruby-on-rails - 在 Rails 中,我从 Guard 那里收到这个错误,说我必须更新到新的 :cmd syntax - 2

    我刚刚更新了我的gem,当我尝试运行Guard时,出现以下错误:Guard::RSpecDEPRECATIONWARNING:The:clioptionisdeprecated.Pleasecustomizethenew:cmdoptiontofityourneed.这是我的Guard文件:guard'rspec',cli:'--drb'dowatch(%r{^spec/.+_spec\.rb$})watch(%r{^lib/(.+)\.rb$}){|m|"spec/lib/#{m[1]}_spec.rb"}watch('spec/spec_helper.rb'){"spec"}#Ra

  10. ruby - 如果哈希中只有一个特定键具有真值(所有其他值均为假),如何返回真 - 2

    例如:options={fight:true,use_item:false,run_away:false,save_game:false}我想要一个计算结果为true的bool表达式,当且仅当:fight为true,其余为false(如上图所示)。我可以一起解决这个问题,但我正在努力训练自己编写更优雅的ruby​​。谢谢!编辑:黑客是:(options[:fight]==true&&options.delete(:fight).values.all{|x|!x}) 最佳答案 假设所有值都是严格的bool值,它很简单:options=

随机推荐