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


70

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

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

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

  class MyVH extends RecyclerView.ViewHolder {...}

还是不影响性能,两种方法都可以使用?

Answers:


106

它比Android问题更多是Java问题。如果要将实例从类中移除,建议对内部类使用static以避免内存泄漏。您可以看一下这篇很棒的文章,它解释了内部类的内存泄漏。

nyx基本上说:

  • 如果将视点保持器声明为静态,则可以在其他适配器中重用它。无论如何,我不建议这样做,创建一个新的分离类并在多个地方使用它,这样做确实更有意义。一门课有一个目的。
  • 对于视图持有者,此类仅在适配器内部使用,其实例不应仅出于定义而进入片段或活动或其他地方。这意味着在视图持有者的情况下,使它静态还是非静态是相同的。

回答您的性能问题,您可以看一下这个答案。静态的内存要比另一静态的内存少,但是同样,我们谈论的是回收器,它们将回收实例,因此对内存的影响不是问题。


完美的解释
user2695433

我不知道两年后您是否读过这篇文章,但是也许您可以回答这个问题:您的答案是否暗示使用非静态内部类ViewHolder实际上是可以的,还是我会误解它?
Florian Walther

是的,只要您正确使用它,实际上就可以,而且不会将该实例带出其父对象
droidpl

18

通过使用静态,这仅意味着您可以MyVh在其他适配器中重复使用。如果您确定只需要MyVh一个适配器,则应使其为非静态。

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

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


1
最有用的用例的简单有效的解释
user2695433 2007年

1

如果要在许多地方使用一个Viewholder,则建议创建单独的类。否则,如果您只想在一个地方使用Viewholder,则创建一个非静态的嵌套Viewholder。静态查看器没有任何意义

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.