Я понимаю идею и использование шаблона Viewholder, но у меня все еще есть один вопрос:
Предположим, у нас есть один TextView в окне просмотра и 10 элементов для отображения ("item0, item1....").
Если я вызову findViewById
один раз, как я понимаю, я иметь один объект этого TextView. Итак, при первом вызове getView я расширяю представление, нахожу ссылку и устанавливаю текст "item0".
При втором вызове я получаю тот же TextView и устанавливаю текст "item1" в тот же TextView.
Почему элемент 0 текст не меняется?
Есть ли клонирование в фоновом режиме?
Реализация Android-просмотрщика
Ответы (2)
Is there any cloning in the background?
Android предварительно выделяет количество представлений, достаточное для заполнения экрана устройства, на котором вы запускаете приложение (пул представлений), идентичные с точки зрения содержимого, но разные с точки зрения эталона.
Предполагая, что вы реализуете свой ViewHolder внутри класса адаптера и используете держатель в методе getView(), единственное, что можно сказать наверняка, это то, что TextView в вашем случае описывает слот родительской структуры (например, ListView). После того, как вы определили слот в xml, который раздувается из вашего адаптера, нет никакого клонирования или чего-то подобного.
Согласно Документация Google идея держателя описана так:
Ваш код может часто вызывать findViewById() во время прокрутки ListView, что может снизить производительность. Даже когда адаптер возвращает увеличенный вид для повторного использования, вам все равно нужно искать элементы и обновлять их. Способом обойти повторное использование findViewById() является использование шаблона проектирования держателя представления.
Объект ViewHolder хранит каждое из представлений компонентов внутри поля тега макета, поэтому вы можете сразу получить к ним доступ без необходимости их повторного поиска. Во-первых, вам нужно создать класс для хранения точного набора представлений.
Нет клонирования, только повторное использование вида