gpt4 book ai didi

android - ViewHolder 不是内部类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:28 25 4
gpt4 key购买 nike

RecyclerView.ViewHolder 可以不用作内部类吗?这样做有什么问题吗?

我四处搜索,但没有找到任何关于它的文档!

最佳答案

实际上,我认为 ViewHolder 应该是静态嵌套类(注意静态!)或顶级类(实际上没有什么不同,只是类名将包含外部类名后跟一个 $然后是内部类名)。

为什么我这么认为?当 ViewHolder 是适配器的非静态内部类时,它保留对适配器的引用。现在,当您调用 RecyclerView.swapAdapter(newAdapter, false)(或者是真的吗?我不记得了)时,新适配器将使用旧适配器之前创建的 ViewHolder。由于不可能清空/清除这些持有者中的此类隐式引用,因此对第一个适配器的引用已泄漏并且无法被垃圾收集。这已经够糟糕了。

但是,就我而言,我遇到了与内存无关的实际问题。 My adapter had a 'selection model' which kept position-to-data mapping and the view holder would use the data when it shown the item (like for instance, when the selection model said the item at position 17 is selected, when it was绘制在屏幕上,它的字体颜色会改变)为用户标记它。它通过仅从适配器访问选择模型字段来完成,这在 Java 中意味着它使用对封闭适配器实例的隐式引用,而不是访问它的字段。现在,在 swapAdapter 之后,保留的 ViewHolder 仍在使用适配器的选择模型,并且 UI 被破坏了,因为一些项目会显示为选中状态,而在新模型中它们不是。

本质上,对于这种比创建它们的适配器生命周期更长并被另一个适配器使用的非静态内部类持有者,不可能真正忘记旧的并使用新的适配器,因为没有办法清除隐式引用.

对此有很多解决方案,其中之一是让 ViewHolder 成为静态嵌套类,并在绑定(bind)时显式为其提供对适配器的引用,并在解除绑定(bind)时将其置空。我一直在为我的 View 持有者使用顶级类,并显式引用适配器,我认为这是你所问的。请注意,持有人通常根本不需要引用他们的适配器,因此您可能根本不需要设置适配器。

当然,我的问题源于我交换了光标;如果您不这样做,您可能永远不会注意到任何问题,但我认为最好了解它们。

关于android - ViewHolder 不是内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com