【发布时间】:2019-08-12 16:35:52
【问题描述】:
我有一个包含嵌套 RecyclerViews 的相当复杂的列表。我知道嵌套的 RecyclerViews 不是最好的解决方案,但在我的情况下,它是创建结构化代码并满足要求的少数解决方案之一。我附上了结构的图像。你可以以电报为例来提高你对结构的理解。基本上我有一个带有项目 RV-1-Item 的外部 RecyclerView RV-1 和一个带有项目 RV-2-Item 的内部 RecyclerView RV-2。到目前为止一切顺利,我的问题是外部 RecyclerView 按预期回收视图,但是如果 RV-1-Items 之一进入视图,则创建 RV-2 的所有 ViewHolders(这意味着有时会创建超过 100 个 ViewHolders )。总而言之,我的问题是如何强制内部 RecyclerView RV-2 也回收 ViewHolders。
我知道内部 RecyclerView RV-2 必须有很高的 wrap_content 因为它取决于内部项目的数量,我也无法设置 setHasFixedHeigth(true) (我不知道它是否有帮助)因为在运行时新的 RV-2-Items 可以添加到 RV-2 中。我还尝试在 RV-2 上设置 setNestedScrollingEnabled(false),因为我在网上阅读了很多关于它的内容,但它也没有帮助我。
所以基本上这就是我的配置方式
RV-1
layoutManager = LinearLayoutManager(context)
isNestedScrollingEnabled = false
RV-2
setHasFixedSize(true)
layoutManager = LinearLayoutManager(context).apply {
reverseLayout = true
}
除此之外,我还有一些 ItemDecorator,但它们只在项目之间创建空间,因此它们不应该对问题做任何事情。
总结一下: 外部 RV-1 按预期回收 ViewHolders,但内部 RV-2 一次创建所有 ViewHolders,即使它们不在屏幕上。我假设是这种情况,因为 RV-2 的高度为 wrap_content,当需要测量 layout_height 时,它需要创建所有视图。 问题:有没有办法强制 RV-2 回收它的视图?
编辑: 此外,我在所有 RV-2 RecyclerViews 之间使用共享 RecycledViewPool 但这与问题并没有真正的关系,因为即使 ViewHolders 在 RecyclerViews 之间共享,RV-2 RecyclerView 也不应该创建不可见的 ViewHolders当它被初始化时。
编辑 2: 很多 cmets 和相关问题都说两个垂直嵌套的 RecyclerViews 在 android 中是不可能的,以防这个问题的所有访问者都认为我的问题是:你将如何实现这样的结构。很明显,我可以制作一个包含 IM(圆形图像视图)和 RV-2-Item 的视图,并在不需要时让 IM 不可见。在我看来,这在某种程度上使结构更加复杂。此外还有一个要求是RV-1-Item左侧的IM必须具有在RV-1-Item中上下移动的能力,这在我目前的结构下显然更容易。
编辑 3:(我承诺的最后一个) 我展示的问题可以通过使用我在编辑 2 中解释的方法来解决,即使它不是最好的解决方案。但问题是我有一个更复杂的屏幕,因为我有三个嵌套的 RecyclerViews,所以这个方法不再起作用。使用 EDIT 2 的方法,我可以将这个数字减少到两个,但我仍然会留下两个嵌套的 RecyclerView,我想不出一种解决方法可以解决剩余的两个嵌套 RecyclerView 的问题。我附上了一张更复杂的屏幕图片,其中包含带有标记部分的应用界面,以帮助您理解结构。
【问题讨论】:
-
当回收器视图位于另一个可滚动内容中时,它会停止回收。这很容易通过将你的 recyclerview 放在 NestedScrollView 中并观察效果来测试。解决方案:不要使用嵌套滚动视图。
-
要理解为什么会这样:在您的 RV-2 看来,尺寸是固定的,因此它知道显示其项目需要多少空间(大小为 1 * 项目数) .外部(RV-1)正在膨胀视图(您的 RV-1 项目)并要求它计算其大小。我们还没有看到您的 XML/代码,但很自然,这会导致 RV-2 继续创建视图,直到它们用完为止,因为没有人告诉它停止。这是像这样嵌套动态滚动内容的副作用。我会重新考虑解决方案(加上这对用户来说是一场噩梦)
-
@user2836202 我明白您为什么将其标记为重复,但您链接的问题已通过使用 GridLayout 解决,这在我的场景中根本不可能。因此,我认为这两个问题并不完全相似,并且有不同的解决方案。我将很快更新我的问题,提供更多信息,使我的问题更加复杂。
-
@MaxGierlachowski 你有办法解决这个问题吗?
标签: android android-recyclerview android-viewholder nestedrecyclerview