RecyclerView Adapter中静态和非静态viewholder有什么区别?

83

使用静态嵌套类在我的MyAdapter扩展RecyclerView.Adapter中的优点是什么:

static class MyVH extends RecyclerView.ViewHolder {...}

使用成员内部类的这种方法:

  class MyVH extends RecyclerView.ViewHolder {...}

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

3个回答

122

这更像是一个Java问题而不是一个Android问题。如果您要将其实例从类中取出,则建议对内部类使用static,以避免内存泄漏。您可以查看这篇很棒的文章,讲解了内部类的内存泄漏。

基本上nyx所说的:

  • 如果您将viewholder声明为static,则可以在其他适配器中重复使用它。无论如何,我不建议这样做,应创建一个新的独立类,并从多个位置使用它,这更有意义。一个类用于一个目的。
  • 在视图持有者的情况下,这些类仅在适配器内使用,它们的实例不应按定义进入fragment或activity或其他任何地方。这意味着静态或非静态,在视图持有者的情况下是相同的。

回答您的性能问题,您可以查看这个答案。静态类的内存占用量比另一种类型的类少,但再次,我们谈论的是会回收实例的recyclers,因此内存影响并不是个问题。


1
完美的解释 - user2695433
我不知道你是在两年后看到这个问题的,但也许你可以回答一下:你的回答是否意味着使用非静态内部类 ViewHolder 是可以接受的,还是我误解了? - Florian Walther
是的,只要您正确使用它,而不将实例带到其父级之外,那么这是完全可以的。 - droidpl

23

使用 static 就意味着您可以在其他适配器中重复使用 MyVh。如果您确定只需要在那一个适配器中使用 MyVh,那么应将其设为非静态。

如果您需要在其他适配器中使用它,甚至最好将其创建为完全独立的类,而不是嵌套类。

对于静态与非静态,性能没有影响!


2
简单而有效的解释最需要的用例。 - user2695433
这不是主要原因。使用静态可以消除内部类的内存泄漏问题。 - Samir Alakbarov

2
如果您想在多个地方使用一个viewholder,则建议创建单独的类。否则,如果您只想在一个地方使用viewholder,则创建非静态嵌套viewholder。静态viewholder没有任何意义。
在大多数情况下,我使用嵌套的viewholder类。
"Original Answer" 翻译成中文为 "最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接