android holder 一定要内部类吗,android – ViewHolder不作为内部类

RecyclerView.ViewHolder可以不用作内部类吗?

这样做有什么问题吗?

我已经四处搜索但没有找到任何文件!

解决方法:

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

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

但是,就我而言,我遇到了与记忆无关的真正问题.我的适配器有一个“选择模型”,它保持位置到数据的映射,视图持有者在显示项目时会使用数据(例如,当选择模型表示选择位置17的项目时,它是在屏幕上绘制,其字体颜色会改变)以便为用户标记它.它是通过从适配器访问选择模型字段来实现的,在Java中它意味着它使用对封闭适配器实例的隐式引用而不是访问其字段.现在,在swapAdapter之后,保留的ViewHolders仍在使用旧适配器的选择模型,并且UI被破坏,因为一些项目将显示为已选择,而在新模型中它们不是.

从本质上讲,这样的非静态内部类持有者不可能比创建它们的适配器寿命更长并且被另一个使用者真正忘记旧的并使用新适配器,因为无法清除该隐式引用.

有很多解决方案,其中一个是ViewHolder是一个静态嵌套类,只是在它绑定时显式地给它一个引用,并在它解除绑定时将其置空.我一直在为我的视图持有者使用顶级类,并明确引用了适配器,我认为这就是你要问的问题.请注意,持有者根本不需要任何对其适配器的引用,因此您可能根本不需要设置适配器.

当然,我的问题源于我交换光标的事实;如果你不这样做,你可能永远不会发现任何问题,但我认为最好注意它们.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值