RecyclerView Adapter 中的静态和非静态视图有啥区别?

Posted

技术标签:

【中文标题】RecyclerView Adapter 中的静态和非静态视图有啥区别?【英文标题】:What difference between static and non static viewholder in RecyclerView Adapter?RecyclerView Adapter 中的静态和非静态视图有什么区别? 【发布时间】:2015-09-26 22:25:47 【问题描述】:

这种方法有什么优点(在我的类 MyAdapter 中使用静态嵌套类扩展 RecyclerView.Adapter):

static class MyVH extends RecyclerView.ViewHolder ...

而这种方法(使用成员内部类):

  class MyVH extends RecyclerView.ViewHolder ...

或者它不影响性能,两种方法都可以使用?

【问题讨论】:

【参考方案1】:

使用静态只是意味着您可以在其他适配器中重复使用MyVh。如果您确定在那个适配器中只需要MyVh,那么您应该使其成为非静态的。

如果您在其他适配器中需要它,最好将它完全创建为一个单独的类,而不是嵌套类。

静态与非静态对性能应该没有影响!

【讨论】:

最需要用例的简单有效解释 这不是主要原因..使用静态消除内部类的内存泄漏..【参考方案2】:

这更像是一个 java 问题而不是 android 问题。如果要将内部类的实例带出类,建议对内部类使用静态以避免内存泄漏。您可以查看 this 很棒的帖子,该帖子解释了内部类的内存泄漏。

基本上是nyx所说的:

如果您将 viewholder 声明为静态,您可以在其他适配器中重用它。无论如何,我不建议这样做,创建一个新的分离类并从多个地方使用它,它确实更有意义。一种目的的课程。 在视图持有者的情况下,此类将仅在适配器内部使用,它们的实例不应仅根据定义转到片段或活动或其他地方。这意味着在视图持有者的情况下,它是静态的还是非静态的都是一样的。

回答你的性能问题,你可以看看this的答案。静态的会比另一种占用更少的内存,但同样,我们正在谈论回收实例的回收器,因此内存影响不是问题。

【讨论】:

完美解释 我不知道您是否在 2 年后阅读此内容,但也许您可以回答这个问题:您的回答是否暗示,实际上可以使用非静态内部类 ViewHolder 或执行我误会了吗? 是的,其实是可以的,只要你使用得当,不用把实例带出它的父级【参考方案3】:

如果您想在多个地方使用一个视图,那么建议创建单独的类。否则,如果您只想在一个地方使用 viewholder,则创建一个非静态嵌套 viewholder。静态视图没有任何意义

在大多数地方,我使用嵌套的viewholder类

【讨论】:

以上是关于RecyclerView Adapter 中的静态和非静态视图有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

安卓recyclerview中的adapter怎么设置item的viewtype

将数据从 RecyclerView.Adapter 传递到片段 onClick

RecyclerView | 在 RecyclerView 中使用 ListAdapter

RecyclerView是如何使用的,阐述ViewHold和adapter的区别?

RecyclerView.Adapter优化了吗?

RecyclerView.Adapter.notifyItemMoved(0,1) 滚动屏幕