android - ViewPager中带有StaggeredGridLayoutManager的RecyclerView,返回fragment时自动排列item
问题描述
我在我的应用程序中使用导航组件,使用谷歌高级示例(此处)。我的问题是返回片段时,滚动位置不会丢失,但它会重新排列项目并移动最高可见项目,以便这些项目的顶部与 recyclerview 的顶部对齐。请看这个:
在进入下一个片段之前:
然后回到片段:
这个问题很重要,因为有时单击的项目会下降并且直到向下滚动才能看到。如何防止这种行为?
请考虑:
如果使用导航组件更改片段,则存在此问题。如果启动片段使用
supportFragmentManager.beginTransaction()
或启动另一个活动,然后转到该片段就可以了。但是如果我使用导航组件导航到另一个片段,则存在此问题。(可能是因为重新创建片段)如果在 ViewPager 中使用片段也存在此问题。即,recyclerView 位于使用 ViewPagerAdapter 处理的片段中,而 viewPager 位于使用 Navigation 组件打开的 HomeFragment 中。如果 recyclerView 在 HomeFragment 中没有问题。
LinearLayoutManager 没问题。仅使用 StaggeredGridLayoutManager。
如果使用 ViewPager2 和 FragmentStatePagerAdapter 没有区别
我试图防止重新创建片段(通过这个解决方案)但没有解决。
更新:你可以从 这里克隆有这个问题的项目
解决方案
当您从一个片段导航到另一个片段时,导航组件的行为是正常的。我的意思是,onDestroyView()
前一个片段的方法被执行了,所以这意味着你的视图被破坏了,但片段没有被破坏。记住片段有两个生命周期,一个用于片段,另一个用于视图,有一个关于它的视频。
此外,在问题跟踪器中注册了一些问题,以避免在某些情况下出现这种行为以及 GitHub 问题:
- https://issuetracker.google.com/issues/127932815
- https://github.com/android/architecture-components-samples/issues/530
问题是当你有很重的片段需要重新创建时,更容易不破坏它而只添加一个片段。因此,当您返回时,它不会被重新创建。但是,因为这种行为不是导航组件的一部分。
解决方案
最简单的解决方案是不使用导航组件并使用传统方式,因为您可以看到这在您的用例中非常有效。
您可以仅针对此用例使用传统方式,而将导航组件用于其他情况。
您可以在活动中扩充此视图。所以你正在添加联合国活动
但是如果前面的树选项是不可能的。您可以尝试以下方法:
最后,如果您想了解更多有关片段如何与导航组件一起使用的信息,可以查看此链接
推荐阅读
- datadog - 我可以阻止 DataDog 关闭 OpsGenie 事件吗?
- javascript - 我在将数据从 javascript 发送到 python 烧瓶时遇到问题
- amazon-web-services - 查找触发 Lambda 函数的 SQS 名称
- cudd - Cudd_PrintMinterm,访问产品总和中的各个最小项
- mongodb - MongoDB 数组中的 $project
- vba - VBA - 从列表框中删除空项目
- javascript - 自从我开始学习 DOM 已经 2 周了。尝试制作语言切换器。不工作
- python - 如何将 tcp 套接字与 ftp 服务器连接
- assembly - 更改 IRQ8 ISR
- javascript - 如何过滤、搜索和排序 Django 前端记录?