Какая разница между статическим и нестатическим просмотрщиком в адаптере RecyclerView?

Каковы преимущества этого подхода (использование статического вложенного класса в моем классе MyAdapter расширяет RecyclerView.Adapter):

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

И этот подход (с использованием внутреннего класса члена):

  class MyVH extends RecyclerView.ViewHolder {...}

Или это не влияет на производительность, и можно использовать оба подхода?


person Lester    schedule 08.07.2015    source источник


Ответы (3)


Это больше вопрос java, чем вопрос Android. Рекомендуется использовать static для внутренних классов, чтобы избежать утечек памяти, если вы вынесете их экземпляры из класса. Вы можете посмотреть это классный пост, объясняющий утечки памяти во внутренних классах.

В основном, что говорит Никс:

  • Если вы объявите средство просмотра статическим, вы можете повторно использовать его в других адаптерах. В любом случае, я не рекомендую делать это, создавать новый отдельный класс и использовать его из нескольких мест, это имеет больше смысла. Один класс для одной цели.
  • В случае владельцев представлений эти классы будут использоваться только внутри адаптера, их экземпляры не должны переходить к фрагменту, активности или куда-либо еще только по определению. Это означает, что статическое или нестатическое, в случае держателей представления, одно и то же.

Отвечая на ваш вопрос о производительности, вы можете взглянуть на этот ответ. Статический будет занимать меньше памяти, чем другой, но опять же, мы говорим о переработчиках, которые будут перерабатывать экземпляры, поэтому влияние памяти не является проблемой.

person droidpl    schedule 08.07.2015
comment
идеальное объяснение - person user2695433; 29.05.2017
comment
Я не знаю, читали ли вы это через 2 года, но, может быть, вы можете ответить на этот вопрос: подразумевает ли ваш ответ, что на самом деле можно использовать нестатический внутренний класс ViewHolder, или я неправильно его понимаю? - person Florian Walther; 19.12.2017
comment
Да, на самом деле все в порядке, если вы используете его правильно, не вынося экземпляр за пределы его родителя. - person droidpl; 19.12.2017

Использование static означает, что вы можете повторно использовать MyVh в других адаптерах. Если вы точно знаете, что вам понадобится только MyVh в этом одном адаптере, вам следует сделать его нестатическим.

Если он понадобится вам в других адаптерах, может быть даже лучше просто создать его как отдельный класс, а не как вложенный класс.

Не должно быть никакого влияния на производительность для статического и нестатического!

person Nyx    schedule 08.07.2015
comment
простое и эффективное объяснение наиболее необходимого варианта использования - person user2695433; 29.05.2017

Если вы хотите использовать один вьюхолдер во многих местах, рекомендуется создавать отдельные классы. В противном случае, если вы хотите использовать вьюхолдер только в одном месте, создайте нестатический вложенный вьюхолдер. Статический видхолдер не имеет никакого смысла

В большинстве случаев я использую вложенный класс viewholder.

person Prashant Kumar    schedule 12.07.2019