标签:android android-recyclerview recycler-adapter android-viewholder
RecyclerView.ViewHolder可以不用作内部类吗?
这样做有什么问题吗?
我已经四处搜索但没有找到任何文件!
解决方法:
实际上,我认为ViewHolder应该是静态嵌套类(介意静态!)或顶级类(实际上没有什么不同,只是类名将包含外部类名后跟$,然后是内部类名称).
我为什么这么认为?当ViewHolder是适配器的非静态内部类时,它保留对适配器的引用.现在,当你调用RecyclerView.swapAdapter(newAdapter,false)时(或者它是真的吗?我不记得了),新的适配器将使用旧版本之前创建的ViewHolders.由于无法在这些持有者中取消/清除此类隐式引用,因此对第一个适配器的引用已泄漏且无法进行垃圾回收.这很糟糕.
但是,就我而言,我遇到了与记忆无关的真正问题.我的适配器有一个“选择模型”,它保持位置到数据的映射,视图持有者在显示项目时会使用数据(例如,当选择模型表示选择位置17的项目时,它是在屏幕上绘制,其字体颜色会改变)以便为用户标记它.它是通过从适配器访问选择模型字段来实现的,在Java中它意味着它使用对封闭适配器实例的隐式引用而不是访问其字段.现在,在swapAdapter之后,保留的ViewHolders仍在使用旧适配器的选择模型,并且UI被破坏,因为一些项目将显示为已选择,而在新模型中它们不是.
从本质上讲,这样的非静态内部类持有者不可能比创建它们的适配器寿命更长并且被另一个使用者真正忘记旧的并使用新适配器,因为无法清除该隐式引用.
有很多解决方案,其中一个是ViewHolder是一个静态嵌套类,只是在它绑定时显式地给它一个引用,并在它解除绑定时将其置空.我一直在为我的视图持有者使用顶级类,并明确引用了适配器,我认为这就是你要问的问题.请注意,持有者根本不需要任何对其适配器的引用,因此您可能根本不需要设置适配器.
当然,我的问题源于我交换光标的事实;如果你不这样做,你可能永远不会发现任何问题,但我认为最好注意它们.
标签:android,android-recyclerview,recycler-adapter,android-viewholder 来源: https://codeday.me/bug/20190612/1223200.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。