Android Paging 3 库:如何使用新参数更改列表?

2023-11-25

我有一个显示搜索项目列表的搜索片段。 如果用户输入某些内容,我会将该字符串作为新的查询参数传递给 url,并使用 paging 3 库获取新列表。

第一个解决方案是:

//viewModel
lateinit var postListUrl: String

    val postList: Flow<PagingData<Post>> = Pager(PagingConfig(pageSize = 20)) {
        PostPagingSource(postRepository, postListUrl)
    }.flow.cachedIn(viewModelScope)

//fragment
fun showPostList(url: String) {
        postListAdapter.submitData(lifecycle, PagingData.empty())
        viewModel.postListUrl = url
        viewLifecycleOwner.lifecycleScope.launch {
            viewModel.postList.collectLatest {
                postListAdapter.submitData(it)
            }
        }
    }

通过此解决方案通过更改 url (showPostList(newUrl),列表保持不变。也许在 viewModel 中使用缓存列表。

另一个解决方案是: 使用showPostList(initUrl) in onViewCreated片段,然后通过更改参数使用 blow 方法:

//fragment
fun changePostList(url: String) {
        viewModel.postListUrl = url
        postListAdapter.refresh()
    }

这项工作有效,但如果旧列表和新列表有共同的项目,新列表将显示在最后一个共同的可见项目上。 例如,如果旧列表的第 5 个位置项与新列表的第 7 个位置项相同,则在列表更改以显示新列表后,它将从第 7 个位置开始,而不是第一个项目。

我找到了另一个解决方案here:

//viewModel
val postListUrlFlow = MutableStateFlow("")
    val postList = postListUrlFlow.flatMapLatest { query ->
        Pager(PagingConfig(pageSize = 20)) {
            PostPagingSource(postRepository, query)
        }.flow.cachedIn(viewModelScope)
    }

//fragment
fun showPostList(url: String) {
        postListAdapter.submitData(lifecycle, PagingData.empty())
        viewModel.postListUrlFlow.value = url
        viewLifecycleOwner.lifecycleScope.launch {
            viewModel.postList.collectLatest {
                postListAdapter.submitData(it)
            }
        }
    }

但通过使用此列表刷新回到片段,有时Recyclerview状态改变。


class MyViewModel:ViewModel(){
  private val _currentQuery = MutableLiveData<String>()
  val currentQuery:LiveData<String> = _currentQuery


  val users = _currentQuery.switchMap { query->
      Pager(PagingConfig(pageSize = 20)) {
      PostPagingSource(postRepository, query)
  }.livedata.cachedIn(viewModelScope)

  }


  fun setCurrentQuery(query: String){
       _currentQuery.postValue(query)
  }
}

通过使用

切换映射

每次更改查询时您都可以获得新结果,并且它将替换旧数据。

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

Android Paging 3 库:如何使用新参数更改列表? 的相关文章

随机推荐

  • 创建没有源镜像(操作系统)的 docker 镜像

    我们可以使用没有源映像 OF 的 docker 文件创建 docker 映像吗 FROM rhel 我们不希望所有应用程序 docker 镜像中都包含基础镜像 centos 或 rhel 我们想要分离基础镜像 centos 或 rhel 和
  • 如何检测 UITableView 标题何时滚动出可见区域?

    如何检测 UITableView 标题 表标题 而不是节标题 何时滚动出可见区域 提前致谢 我能想到几种可能的解决方案 1 您可以使用该委托的方法 表视图 didEndDisplayingHeaderView forSection 但是 仅
  • 使用 Android Espresso 进行测试时如何单击操作栏项目?

    我正在使用 Android Espresso 来测试我的活动 我有多个操作栏项目 其中大部分隐藏在溢出中 我正在尝试运行此测试 但错误表明层次结构中没有视图 与不可见不同 MediumTest public void testClickIn
  • 渲染部分视图时如何调用控制器操作?

    我正在为侧边栏创建部分视图 该侧边栏将显示我的网站中最受欢迎的帖子 如何创建一个单独的控制器来加载部分视图所需的模型 这IEnumerable
  • 带有虚函数的类的大括号初始化

    有这样的代码 struct A int x void f struct B int y virtual void f A a 2 B b 3 error no matching constructor for initialization
  • 让 NFC/Beam 更加自动化

    我正在向我的应用程序添加 NFC Beam 功能 我希望它尽可能自动工作 我想摆脱发送者的 触摸到光束 屏幕和接收者的 扫描新标签 屏幕 基本上 我希望它像三星广告中那样工作 我在 stackoverflow 上读到 似乎没有办法摆脱 To
  • JavaScript 中分组运算符“()”的功能与 Haskell 或其他编程语言有何不同?

    分组运算符 在 JavaScript 中 分组运算符 控制表达式中求值的优先级 有没有功能 JavaScript 本身与 Haskell 或任何其他编程语言有何不同 换句话说 功能是否齐全 编程语言本身受评估策略 也许我们可以分享下面的代码
  • MVC 4模型中提交表单在控制器post方法中为空

    所以我现在的问题是 当我提交以下表单时 我无法将模型放入控制器中 我试图让 BillingCodes 这是 BillingCodeObjects 的列表 中的项目循环通过并显示 我从其中删除了一些与情况无关的代码 以使其更短且更易于阅读 这
  • 如何本地化 WPF 4.0 DatePicker 控件

    当您清除新的 WPF 4 0 DatePicker 控件上的框时 它会显示 选择日期 有没有办法本地化文本 我采纳了马特的想法 并对其进行了一些扩展 我实现了一个附加行为 它允许您通过 XAML 为每个 DatePicker 控件定义水印
  • C# 中保存的 JPG 的质量

    我制作了一个小型 C 应用程序来创建 jpg 格式的图像 pictureBox Image Save name ImageFormat Jpeg 镜像创建成功 我输入一张原始图片 用它做一些事情并保存它 然而 这张新照片的质量低于原始照片
  • 如何使用 grep 进行搜索和替换

    我需要在目录中的所有文件和子目录中递归搜索指定的字符串 并用另一个字符串替换该字符串 我知道找到它的命令可能如下所示 grep string to find r 但我怎样才能替换每个实例string to find用另一个字符串 另一种选择
  • Mongoose Schema 尚未注册模型

    我正在使用 MEAN 堆栈 当我尝试使用以下命令启动服务器时npm start 我得到一个例外 schema hasn t been registered for model Post Use mongoose model name sch
  • ASP.NET MVC:对操作强制执行 AJAX 请求

    我正在寻找一种方法来强制只能通过 AJAX 请求访问控制器的操作 在调用操作方法之前执行此操作的最佳方法是什么 我想从我的操作方法中重构以下内容 if Request IsAjaxRequest Do something else retu
  • 应用内购买沙盒测试 - 老沙盒用户不断提示

    我正在开发一款带有应用内购买功能的 iPhone 游戏 我试图通过调用restoreCompletedTransactions 来检索沙盒用户之前的购买 但没有触发任何回调 我在网上看到其他一些遇到类似问题的人删除了沙箱用户并尝试创建一个新
  • 无法从 Visual Studio For Mac 在 iPhone 模拟器中运行 Xamarin 应用程序

    简而言之 我无法在 iPhone 模拟器中运行我的应用程序 没有 播放按钮 三角形 只有一个 调试器 按钮 锤子 As you can see above I have Generic Simulator When I click on i
  • 如果 URL 和图像都存在,Facebook SLComposeViewController URL 将显示在正文中

    Using SLComposeViewController 如果图像和 URL 都存在 我在发布到 Facebook 时会注意到奇怪的行为 具体来说 如果您同时拥有图像和 URL 则该 URL 将显示在 Facebook 帖子的正文中SLC
  • 如何通过 Julia HTTP 访问 API

    使用 Julia 访问 Betfair Exchange API 我已经使用 Julia 大约 2 个月了 最近一直在尝试使用 Julia 访问 Betfair API 有关此服务的说明请参见此处 https docs developer
  • 在 C# 类中重载 vb.net & 运算符

    我这里有一个非常独特的问题 我们的业务应用程序是使用 c 和 vb net 构建的 我们一直在努力接近一个标准 并为我们的一些核心 已经复制的对象削减脂肪 我们已经非常接近了 但是当尝试将重复对象合并到 c 中时 我们的 vb net 代码
  • noexcept 依赖于成员函数的 noexcept

    考虑 class test private int n int impl const noexcept return n public test delete test int n noexcept n n int get const no
  • Android Paging 3 库:如何使用新参数更改列表?

    我有一个显示搜索项目列表的搜索片段 如果用户输入某些内容 我会将该字符串作为新的查询参数传递给 url 并使用 paging 3 库获取新列表 第一个解决方案是 viewModel lateinit var postListUrl Stri