ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段

2023-12-13

我有基本的 ViewPager2 和 Tablayout - 在每个页面中我都有不同的片段。 当我需要不从第一个(默认)选项卡打开此视图时,我正在这样做:

 viewPager.currentItem = selectedTabPosition

此代码选择选项卡,但在其中打开第一个选项卡的片段!仅当我通过点击来选择选项卡时 - 我才能在每个选项卡中看到正确的片段。 我也尝试使用 Tablayout 进行选择,如下所示:

tabLayout.getTabAt(position)?.select()

但这段代码没有帮助,也可以解决这个错误。 我也尝试过设置viewPager.currentItem with post / postDelay- 但这也行不通。

也许我失去了一些东西?或者这是 ViewPager2 中的错误?

(编辑 - ViewPager 代码)

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    setupPagerAdapter()
}

private fun setupPagerAdapter() {
    val adapter = MainDocumentScreenPagerAdapter(this)

    binding?.viewPager?.letUnit {
        it.adapter = adapter
        binding?.tabsPagerView?.attachViewPager(requireContext(), it, adapter)

        // set tab
        it.currentItem = params.pageType.ordinal
}

适配器代码

class MainDocumentScreenPagerAdapter (fragment: Fragment) : ViewPager2TitleAdapter(fragment) {

override fun getItemCount(): Int = DocumentPageType.values().size

override fun createFragment(position: Int): Fragment {
    val pageType = DocumentPageType.values().firstOrNull { it.ordinal == position } ?: throw IllegalStateException()

    val params = DocumentListFragment.createParams(pageType)
    return DocumentListFragment.newInstance(params)
}

override fun getPageTitle(position: Int): Int? {
    return when (position) {
        DocumentPageType.ALL.ordinal -> DocumentPageType.ALL.title
        DocumentPageType.SIGN.ordinal -> DocumentPageType.SIGN.title
        DocumentPageType.ACCEPT.ordinal -> DocumentPageType.ACCEPT.title
        DocumentPageType.CONFIRM.ordinal -> DocumentPageType.CONFIRM.title
        DocumentPageType.REJECT.ordinal -> DocumentPageType.REJECT.title
        else -> null
    }
}

其中 ViewPager2TitleAdapter 是:

abstract class ViewPager2TitleAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
abstract fun getPageTitle(position: Int): Int?

DocumentListFragment在其中根据参数对象创建视图。

我还尝试在 OnCreate 内创建适配器 - 但它不会影响这种情况。


最后但并非最不重要的 - 当我尝试打开屏幕外的选项卡(我有可滚动选项卡)时 - viewPager 打开带有正确片段的选定选项卡。所以,只有当我尝试打开屏幕上显示的前 4 个选项卡(查看图像)。从第 5 个和下一个选项卡开始的位 - 已选择正确。

enter image description here


所以,决定就在这行代码中:

it.setCurrentItem(params.pageType.ordinal, false)

但我是这样做的:

it.currentItem = params.pageType.ordinal

boolean false在这种情况下发挥魔法 - 它禁用平滑滚动。我从这个关于 ViewPager2 的答案中得到了它:

https://stackoverflow.com/a/67319847/4809482

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

ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段 的相关文章

随机推荐

  • 如果购物车中有特定产品,请禁用所有支付网关

    我想在特殊情况下禁用所有支付网关 我有 2 种特殊产品 我不想在结账时与任何其他产品组合使用 可以说我的 特别的 产品 ID 是496 and 484 所有其他都是 normal 产品 如果其中之一 特别的 产品在购物车中 例如我想禁用 p
  • Rails 实现自动完成搜索

    我不确定如何为我的搜索功能添加自动完成表单 我有一个具有自定义操作的以下控制器 def query users Search user params query article Search article params query end
  • SQL Server 2005 用 0 填充数据透视表

    I have 这个查询在 SQL Server 2005 中 我仅使用更方便的 2008 插入方法作为示例 我需要在网格输出中将 null 替换为 0 无论如何要这样做吗 你会使用ISNULL 功能 看SQL小提琴 SELECT lesso
  • 在开发过程中调整 MySQL 以快速创建列/索引

    假设 MySQL MyISAM 表包含 1 GB 数据和 1 GB 索引 此外 假设在开发过程中 列和索引将非常频繁地从表中添加和删除 由于数据库的大小 使用标准的未调整的 MySQL 设置时 列 索引的创建速度很慢 为了最大限度地减少添加
  • 获取传递给方法的参数名称[重复]

    这个问题在这里已经有答案了 复制 确定用作方法参数的变量名称 有什么方法可以检索传递给方法的参数的名称 例如 int someParameter 1 Method someParameter public void Method int p
  • NextJS React - WebpackError:窗口未定义

    我正在尝试玩 React 我遵循了 NextJs 的 入门 教程 link 并且我已经成功创建了新项目 一旦我尝试导入第三方插件 例如当前设备 or 平滑滚动条我收到以下错误 ReferenceError window is not def
  • .Net Maui:如何从任何内容页面(MVVM)读取/写入(获取/设置)全局对象

    我确信我在这里遗漏了一些深刻或明显的概念 现在我有了一个页面 可以设置各种蓝牙传感器并从心率监视器 速度计和踏频传感器获取数据 使用插件 BLE 因此 我在 ViewModel 中为名为 BluetoothPage 的 ContentPag
  • 反转 CSS 动画

    我这样做了 http codepen io yayoni pen pgXoWY 当我点击小按钮时 我想反转动画 但我所做的不起作用 我不明白为什么 function anim var div document getElementById
  • Android LinearLayout 在 Horizo​​ntalScrollView 中具有多行

    我在 Horizo ntalScrollView 中使用 LinearLayout 滚动部分正在工作 但我不知道如何制作 3 行 例如 Bold显示当前显示的内容 在模拟器中 在屏幕上 Current 按钮1 按钮2 按钮3 按钮4 按钮5
  • 单击菜单标题时连接函数

    我正在尝试找到开放的端口并将它们添加到我的菜单中 现在 我成功地对菜单执行了一个操作 例如 查找端口 并且只有单击它时 它才会连接到获取所有可用端口的函数 不幸的是 这不是我想要的 我想点击菜单title 并获取我的菜单中的所有端口 下面是
  • 从数值向量获取类别

    我有这个数字向量 vec lt 1 7 如何使用这些逻辑规则将其转换为 3 类 if vec gt 1 vec lt 4 then category1 else if vec gt 4 vec lt 6 then category2 els
  • 具有 Azure AD B2C 和单点登录的 MSAL

    我正在开发一个带有几个 Angular 4 SPA 的系统 每个 SPA 都与一个单独的 Asp NET Core 2 0 WebAPI 进行通信 Azure AD B2C 用作每个 SPA API 的身份服务 MSAL js 用作我们 A
  • 如何获取网络接口及其正确的 IPv4 地址?

    我需要知道如何获取所有网络接口及其IPv4地址 或者只是无线和以太网 要获取所有网络接口详细信息 我使用以下命令 foreach NetworkInterface ni in NetworkInterface GetAllNetworkIn
  • 我需要什么样的加盟?

    我有一个投票表 votes userid gameid a 1 a 2 a 3 b 1 b 2 和一张游戏桌 games gameid title 1 foo 2 bar 3 fizz 4 buzz 我将使用哪种联接来执行查询 从 用户 A
  • SonarQube MSBuild 无法排除文件

    我正在 debian 上使用 msbuild 运行分析 使用以下命令 mono msbuild SonarQube Scanner MSBuild exe begin d sonar login
  • Maven war/jar 大小太大

    我正在构建一个项目 其中最终的战争 罐子大小非常大 我不知道如何减小罐子的大小 如何只构建项目所需的jar 目前我们只是在依赖项中给出了 maven 构建插件 并在顶部给出了构建 war 或 jar 的工件 id 请指教 Thanks 在您
  • Redis 数据库 TTL

    无论如何 有没有办法创建一个 Redis 数据库 其中键HAVE TO一定时间后会过期吗 我知道我可以使用以下命令使单个密钥过期EXPIRE命令 但由于无论如何我都会在一定时间后使每个密钥过期 因此最好在 Redis 配置文件中指定此行为
  • Java如何计算时差

    如果用户输入是 2255 和 2305 我如何计算 24 小时内的时间差 输出应该是 10 分钟 我的一个想法是将输入分成两部分 2 位数字和 2 位数字 前 2 位数字是小时 乘以 60 即可得到分钟 然后加上后2位数字 然后计算差值 我
  • R - 查找数据框子集中的所有唯一值

    我有一个包含两列的数据框 第一列定义数据的子集 我想找到第二列中仅出现在第一列的一个子集中的所有值 例如 来自 df data frame data subsets rep LETTERS 1 2 each 5 data values c
  • ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段

    我有基本的 ViewPager2 和 Tablayout 在每个页面中我都有不同的片段 当我需要不从第一个 默认 选项卡打开此视图时 我正在这样做 viewPager currentItem selectedTabPosition 此代码选