Класс держателя в классе адаптера

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

Solutions Collecting From Web of "Класс держателя в классе адаптера"

Ваш код может часто вызвать findViewById() во время прокрутки ListView , что может замедлить производительность. Даже когда адаптер возвращает завышенный вид для повторной переработки, вам все равно нужно искать элементы и обновлять их. Способ многократного использования findViewById() заключается в использовании шаблона дизайна "view holder" .

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

Вы можете прочитать Android Guideline для более подробной информации.

  1. Поэтому, когда вы используете «View Holder», вы можете легко получить доступ к каждому виду без необходимости поиска, экономя ценные циклы процессора.
  2. Наличие static inner class для представлений значительно повышает производительность

Вы также можете увидеть, почему Android предпочитает ссылку на статические классы .

Еще одна интересная ссылка Как работает ListView Work , после прочтения этого блога разработчик может очистить логику LisView, а также зачем нужно внедрять внутренний статический класс для listView.

Ответ также прост, если вы понимаете, как работает AdapterView .

AdapterView – это представление, чьи дети определяются Adapter . AdapterView (более конкретно, конкретная реализация, например ListView ) содержит больше информации, чем показано в любой момент времени. Чтобы оптимизировать потребление памяти, а также ради производительности, Adapter обычно повторно использует View S, представляющее отдельные элементы. Таким образом, у вас меньше объектов View чем соответствующие данные.

ViewGroups используемые объекты могут быть сложной иерархией View s или ViewGroups . Поэтому, если вы хотите найти отдельные объекты View из этой иерархии, вам нужно будет зависеть от метода findViewById() и это становится дорогостоящим, если иерархия представлений имеет несколько уровней. Поэтому для простоты (а также для повышения производительности) используется шаблон View-Holder, где отдельные объекты View которые нас интересуют, присваиваются статическому внутреннему классу.

Для получения дополнительной информации о шаблоне View-Holder вы можете обратиться к LView Vogel в Android ListView и ListActivity – Tutorial .

Это точка оптимизации. Без viewHolder вам нужно будет каждый раз вызывать методы findViewById. С помощью viewHolder вам нужно только вызвать их один раз.

Пример с TextView и ImageView:

  • Без ViewHolder:

     if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...) 
  • С помощью ViewHolder:

     if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)