почему шаблон ViewHolder работает? - PullRequest
2 голосов
/ 12 мая 2011

Сегодня я изучил ArrayAdapter для Android и обнаружил, что есть шаблон commom, который использует ViewHolder для хранения ссылки на Views вместо вызова findViewById каждый раз.

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

Ответы [ 3 ]

13 голосов
/ 13 мая 2011

Если вы хотите получить лучшее объяснение о том, как работает ViewHolder, ознакомьтесь с выступлением Романа Гая о Google I / O 2009 в youtube , особенно в первые 15 минут.

Короче говоря, Adapter функционирует как связь между базовыми данными и ViewGroup.Он будет отображать столько View с, сколько требуется для заполнения экрана.При прокрутке или любом другом событии, которое выдвигает View вне экрана, Adapter будет повторно использовать View, заполненный правильными данными, для отображения на экране.

Метод getView(int pos, View view, ViewGroup parent) будет использовать правильный View в любое время, независимо от вашего макета.Я не знаю, как это работает, но я уверен, что вы можете просмотреть исходный код любого адаптера (например, ArrayAdapter.java ), если вам интересно.
ViewHolder просто сохраняет указатель на Views, полученный с помощью view.findViewById(int id).Адаптер несет ответственность за возвращение правильных данных, соответствующих любой позиции.

Слайды с 11 по 13 из Презентация Ромена сделает его намного более понятным, чем все, что я могу написать.

1 голос
/ 13 мая 2011

Извините, но ответ Дениса может быть неправильным.Фактически, экземпляры вида (и ViewHolders) имеют столько, сколько может отображать ваш экран .

Если ваш экран выглядит так:

[list view]
the first item
the second item
the third item
the fourth item

У вас будет 4примеры просмотров.Если вы прокрутите экран, первый исчезнет, ​​но вам будет передано getItem () как convertView для создания пятого элемента.

Таким образом, вы можете использовать ссылки в первом ViewHolder.

0 голосов
/ 12 мая 2011

Я считаю, что работа под представлением списка выглядит примерно так (учитывая, что у нас есть только один тип представления элемента):

сделать один раз:

inflate item view from layout, cache it

Повторите для каждого элемента:

ask adapter to fill the data into the view
draw the view on the screen
move to next item

так что у вас есть представление, которое надувается из макета xml и может быть повторно использовано для рисования нескольких элементов списка. ViewHolder ускоряет его, сохраняя результаты поиска getViewById.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...