恢复分页库 3 中的滚动位置

2024-03-26

我将 Paging Library 3 与 RemoteMediator 一起使用,其中包括从网络和本地 Room 数据库加载数据。每次我滚动到 RecyclerView 中的某个位置,导航到另一个片段,然后导航回带有列表的片段时,滚动状态不会保留,并且 RecyclerView 显示从第一个项目开始的列表而不是位置在我离开之前我就已经到了。

我尝试使用 StateRestorationPolicy 但没有成功,并且似乎无法找到一种方法来获取 PagingDataAdapter 的滚动位置并在导航回 Fragment 时将其恢复到相同的精确位置。

在我的 ViewModel 中,我有一个从 RemoteMediator 收集数据的 Flow:

val flow = Pager(config = PagingConfig(5), remoteMediator = remoteMediator) {
    dao?.getListAsPagingSource()!!
}.flow.cachedIn(viewModelScope)

我正在将该数据提交给我的片段中的适配器:

viewLifecycleOwner.lifecycleScope.launch {
    viewModel.flow.collectLatest { pagingData ->
        adapter?.submitData(pagingData)
    }
}

在片段的顶部,我的适配器列出为:

class MyFragment : Fragment() {

    ...

    private var adapter: FeedAdapter? = null

    ...

    override onViewCreated(...) {

        if (adapter == null) {
            adapter = FeedAdapter(...)
        }

        recyclerView.adapter = adapter

        viewLifecycleOwner.lifecycleScope.launch {
            viewModel.flow.collectLatest { pagingData ->
                adapter?.submitData(pagingData)
            }
        }
    }
}

我们如何确保适配器在返回时准确地显示列表在用户离开片段之前的位置,而不是从第一个位置开始列表?


在片段的 onViewCreated 中执行此操作:

viewLifecycleOwner.lifecycleScope.launch {
    viewModel.flow.collect { pagingData ->                
        adapter.submitData(viewLifecycleOwner.lifecycle, pagingData)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

恢复分页库 3 中的滚动位置 的相关文章

  • 启动画面反应本机后出现白屏

    编辑 似乎是因为 MainActivity 加载太重而生成白屏 我设法首先使用本机启动屏幕来解决 然后在本机被杀死后立即基于下一个插件的 js 实现 我做了一些修改完美匹配两个启动画面https github com crazycodebo
  • Parcelable 写入可序列化对象 getactivity() 时遇到 IOException

    所以我在 logcat 中得到了这个 java lang RuntimeException Parcelable encountered IOException writing serializable object name com re
  • 关于android Sqlite在多进程情况下的安全性

    在我的应用程序中 存在多个进程 并且在每个进程中 我需要访问同一个SQLite数据库 当然 这意味着超过2个线程 所以我不仅担心SQLite的线程安全性 还担心SQLite的线程安全性 还有过程安全 这种情况的一种解决方案是使用内容提供者
  • 如何设置itemTouchHelper选择性滑动?

    所以我在 recyclerview rv 上实现了这个 itemtouchhelper simple 回调 现在 在这个 rv 中 我根据内容类型将 2 种布局设置为一行 因此 当我在 rv 上设置此 touchhelper 时 它正在这两
  • 应用程序启动时立即隐藏导航栏

    基于以下代码片段 我能够隐藏状态栏当应用程序启动时 但不是导航栏 由后退 主页和任务管理器按钮组成的栏 因为它隐藏了稍后在 MainActivity 的线程完成加载后 这是清单
  • 如何在发布版本中使用 Zebra EMDK?

    所以我有一台 Zebra MC330M 设备 我之前创建了一个应用程序 我想使用 PDA 内置的条形码扫描仪 如果在调试模式下运行我的应用程序 一切正常 我可以读取条形码 但是如果我创建暂存或释放版本 apk 则条形码读取器不活动 因此如果
  • 可以混淆/加密 SharedPreferences 文件吗?

    因此 我对混淆应用程序的 SharedPreferences xml 文件很感兴趣 就像 Android LVL 混淆其许可证 cahce 数据一样 这是可以想象的吗 大量的谷歌挖掘几乎没有产生任何可能解决我的问题的结果 我当然不是密码学家
  • 将文本视图包裹在图像视图周围

    晚上好 我正在尝试将文本包裹在图像视图中 就像这里提出的问题一样 Textview 环绕 View https stackoverflow com questions 3626750 textview wrap around view 在风
  • 如何防止 Activity 在后退操作时重新加载

    我有连接到互联网以获取数据的应用程序 我可以多层次访问数据 假设我从第 3 级开始 在第 4 级我决定返回 每当我按回之前的活动时 就会从互联网重新加载数据 有可能阻止这种情况吗 我尝试以单顶模式运行该活动 将数据加载代码移至 single
  • 尝试使用掩码裁剪位图会抛出 IllegalArgumentException:

    我正在使用以下代码 public void cropSelection Bitmap bitmap annotationBitmap copy annotationBitmap getConfig true Canvas canvas ne
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。问题

    我的 android studio 遇到了下一个问题 导致 org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveEx
  • Android 可检查子菜单选项

    所以我有一个用于选项菜单项的子菜单 我想要一个可检查条目的列表 用户可以根据需要选择 取消选择多个条目 我无法解决的唯一问题是如何防止单击其中一个复选框时关闭选项菜单 我看到 PerformShortcut 有一个 FLAG PERFORM
  • Android Youtube API 可用吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有适用于 Android 的 YouTube API 吗 如果不是 除了通过网络浏览器之外 如何从 Yo
  • android sqlite 如果不存在则创建表

    创建新表时遇到一点问题 当我使用 CREATE TABLE 命令时 我的新表按应有的方式形成 但是当我退出活动时 应用程序崩溃 并且我在 logcat 中得到一个表已存在 如果我使用 CREATE TABLE IF NOT EXISTS 则
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • Android EditText 不起作用,android:imeOptions="actionNext" android:inputType="phone"

    我已经尝试过了 只有删除android inputType phone 键盘回车可以跳转到下一个EditText 不知道大家之间是否有过一些冲突android imeOptions actionNext and android inputT
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • 如何在对话框中配置自定义按钮?

    这里我有一个自定义对话框 里面有背景 2 ImageButton 问题是 当我尝试为该按钮设置 onclick 侦听器时 程序将返回 NullPointerException 我不知道为什么会发生这种情况 无论如何如何将操作分配给对话框内的
  • 更改 Android 中突出显示文本的颜色

    我不确定这是否可能 也许有人可以纠正我 我在 Android 应用程序中有一个 EditText 视图 该视图在蓝色背景上有白色文本 当选择文本时 通过长按和编辑对话框 我希望突出显示为白色并将文本颜色更改为黑色 令人烦恼的是 似乎没有办法

随机推荐

  • python中连接数据点的线的箱线图

    我试图根据与点相关的特定关系来连接线 在此示例中 线条将连接玩家所在的球场 我可以创建基本结构 但还没有找到一种相当简单的方法来创建此附加功能 import pandas as pd import numpy as np import ma
  • HTML5 Web 应用程序中 OAuth2 的本地存储与 cookie

    我目前正在尝试使用 OAuth2 来开发一个完全用 JavaScript 构建的移动应用程序 该应用程序与 CakePHP API 进行通信 查看以下代码以了解我的应用程序当前的外观 请注意 这是一个实验 因此代码混乱 区域缺乏结构等 va
  • UnsafeQueueUserWorkItem 以及“不传播调用堆栈”到底是什么意思?

    我正在阅读和学习ThreadScheduler以及有关任务的文章并遇到了该功能ThreadPool UnsafeQueueUserWorkItem用于其中之一MSDN 示例 http msdn microsoft com en us lib
  • 使用 C# 在 XML 中进行 SAML 断言

    这是我面临的问题 需要一些帮助 指导 我已经从我的引擎生成了一条 XML 消息 需要将其解析为服务 为此 我必须将该消息更改为 SOAP 消息并在其上插入 SAML 令牌 我正在尝试使用 C 代码执行此操作 以下是我生成的输入消息及其预期输
  • 如何在 Visual Studio Code 中显示函数的使用?

    我使用 Pycharm 时可以按 ctrl 单击函数定义并查看用途 VSC 中有类似的吗 You can use Find All References Shift F12 to get a better view of usage htt
  • 用连字符替换所有非字母和数字的字符[重复]

    这个问题在这里已经有答案了 我面临着 URL 的问题 我希望能够转换可以包含任何内容的标题 并去掉所有特殊字符 这样它们只有字母和数字 当然我想用连字符替换空格 这将如何完成 我听说过很多关于正则表达式 regex 的使用 这应该可以满足您
  • R - 绘制缺少 NA 值的线

    我有以下 data frame 子集 Time A B C 2016 10 07 06 16 46 NA NA 41 2016 10 07 06 26 27 40 39 42 2016 10 07 06 38 23 NA 40 NA 201
  • 为什么 Django 为代理模型创建迁移文件?

    我刚刚创建了一个代理模型 https docs djangoproject com en 1 9 topics db models proxy models并惊讶地发现manage py makemigrations创建一个新的迁移文件mi
  • 问:在场景滚动时禁用“放大/缩小”

    我们使用基于 Roomle Web SDK 的基础存储库 Roomle UI 我们目前正在对此进行定制并将其相应地集成到我们的网站中 我们想通过滚动禁用自动 放大 它会中断预期的用户流程 不幸的是 我们还没有找到一种方法来实现这一点 而不保
  • c++11 中的 库可移植吗?

    c 11 中的库可移植吗 我避免使用 rand 因为我听说它不可移植 你如何定义 便携 如果 便携式 的意思是 在给定相同输入的情况下将产生二进制相同的随机数序列 那么是的 rand不便携 是的 C 随机生成器 http en cppref
  • Matlab 将文件从 Windows 资源管理器拖放到图形 (gui)

    我想知道有一种方法可以从 Windows 资源管理器中拖动文件并将其放入我的 GUI 中 目标应该是获取文件路径 或文件夹路径 并能够使用我自己的加载函数加载它 我准确地说 我在 Windows 10 64 位中使用 Matlab 2015
  • 如何使用 Javascript 禁用功能键?

    我有一个页面 我需要禁用功能键 主要是 F12 开发工具 我在页面中显示了一些敏感数据 因此无论如何我都无法让用户看到 html 并获取隐藏字段 我检查了一些 javascript 它适用于除了 f1 f12 等功能键之外的几乎所有键 无论
  • SQL Server,无法在主键字段中插入空值?

    我已经准备好在这件事上抓狂了 我对 MS SQL 还很陌生 还没有在任何地方看到过类似的帖子 当我尝试做这样的声明时 INSERT INTO qcRawMatTestCharacteristic VALUES NULL 1 1 1 1 1
  • Neo4j https 通信

    有没有办法只允许 https 而不是 http 与 Neo4j 服务器通信 另外 Neo4j Shell 的通信使用哪个通道 http 还是 https 这是来自 Neo4j 文档 HTTPS 支持 http docs neo4j org
  • Python 的按位求补运算符 (~ 波形符) 是如何工作的?

    为什么 2等于 3 如何 操作员工作 请记住 负数存储为二进制补码的正对应物 作为示例 以下是 2 的二进制补码表示形式 8 位 1111 1110 获得此值的方法是采用数字的二进制表示形式 取其补码 反转所有位 并加一 两个以 0000
  • 有条件地将键值对包含在哈希中[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人可以帮我缩短以下方法吗 我从这个开始 我很喜欢 def self some hash foo gt bar end 现在我想添加一个可选键 我能想
  • 无法重新加载 nginx.service:需要交互式身份验证

    我正在使用 symfony 3 进行项目 项目运行在nginx服务器上 我正在尝试使用以下命令重新加载配置文件 从控制器 systemctl reload nginx Route testReloadConfig public functi
  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • Java 中的克隆

    我在网上读到一段关于克隆的内容 但我不太明白 所以有人能解释清楚吗 如果类具有 Final 字段 则无法在克隆方法中为这些字段赋予值 这会导致正确初始化对象的最终字段出现问题 如果最终字段引用对象的某些内部状态 则克隆的对象最终会共享内部状
  • 恢复分页库 3 中的滚动位置

    我将 Paging Library 3 与 RemoteMediator 一起使用 其中包括从网络和本地 Room 数据库加载数据 每次我滚动到 RecyclerView 中的某个位置 导航到另一个片段 然后导航回带有列表的片段时 滚动状态