Какова цель `конвертирования 'в адаптере ListView?
В андроиде я обычно использую MyAdapter extends ArrayAdapter
для создания представления для ListView
, и в результате я должен переопределить функцию
public View getView(int position, View convertView, ViewGroup parent) {
// somecode here
}
Однако я не знаю точно, что делают convertView
и parent
! У кого-нибудь есть предложение? Подробнее, больше помощи! Спасибо!
Ответы
Ответ 1
Из документации
convertView - старое представление для повторного использования, если это возможно. Примечание. Перед использованием убедитесь, что это представление не имеет значения null и соответствующего типа. Если невозможно преобразовать это представление для отображения правильных данных, этот метод может создать новое представление.
Другими словами, этот параметр используется строго для повышения производительности вашего Adapter
. Когда a ListView
использует Adapter
для заполнения своих строк с помощью View
s, адаптер заполняет каждый элемент списка объектом View
, вызывая getView()
для каждой строки. Адаптер использует convertView
как способ утилизации старых View
объектов, которые больше не используются. Таким образом, ListView
может отправлять старые, "переработанные" объекты "Adapter", которые больше не отображаются, а не создают экземпляр совершенно нового объекта каждый раз, когда адаптер хочет отобразить новый элемент списка. Это цель параметра convertView
.
Ответ 2
convertView
используется для повторного использования старого представления.
Пожалуйста, поймите Adapter
функциональность в android. Adapter
позволяет повторно использовать некоторое представление с новыми данными.
Итак, если список состоит из 15 элементов, но окно может отображать только 5 элементов, то сначала convertView
будет пустым, и нам нужно создать новые представления для этих пяти элементов, но когда вы прокрутите вниз, у вас есть два варианта, либо создайте 6-10 просмотров, либо повторно используйте старые представления и загрузите новые данные в эти представления.
Adapter
и convertView
позволяет вам использовать более поздний метод.
Ответ 3
convertView - это кеш элемента ListView, который не отображается, и, следовательно, его можно использовать повторно. Это позволяет ListView не создавать много ListItems, следовательно, сохранение memeory и сделать ListView более гладким.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null) {
view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false);
}
else {
view = convertView;
}
// remaining implementation
return view;
}
Ответ 4
Более короткая версия:
Пожалуйста, прочитайте @Alex Lockwood и @jeet ответ.
Мой ответ:
До чего, что является лучшим/правильным способом использования convertView
в getView()
? Хорошо объяснил Ромен Гай в этом видео.
пример,
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
ViewHolder holderObject;
if (rowView == null) {
rowView = inflater.inflate(R.layout.list_single_post_or_comment, parent, false);
holderObject = new HolderForContent();
mapHolder(holderObject, rowView);
rowView.setTag(holderObject);
} else {
holderObject = (HolderForContent) convertView.getTag();
}
setHolderValues(holderObject, position);
return rowView;
}
private class ViewHolder {
TextView mTextView;
}
mapHolder(holderObject, rowView) {
//assume R.id.mTextView exists
holderObject.mTextView = rowView.findViewById(R.id.mTextView);
}
setHolderValues(holderObject, position) {
//assume this arrayList exists
String mString = arrayList.get(position).mTextViewContent;
holderObject.mTextView.setText(mString);
}
Выше всего лишь пример, вы можете следить за любым типом шаблона. Но помните это,
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// todo : inflate rowView. Map view in xml.
} else {
// todo : get already defined view references
}
// todo : set data to display
return rowView;
}
Теперь переход к цели из convertView
. Почему?
convertView
используется для оптимизации производительности [см. таблицу в слайде 14 от Ромена Гая] который уже был создан.
Источники:
Любые исправления приветствуются. Я действительно собрал эту информацию через эти ссылки,
Читайте о getView()
в Android-разработчике документация.
Ромен Гай говорит о getView()
в видео "Turbo Charge Your UI" в Google IO 2009 и материал, используемый для презентации.
Замечательный блог от Lucas Rocha.
Те, кто хочет глубоко погрузиться в исходный код: ListView и образец реализация getView()
можно увидеть в исходном коде для arrayAdapter.
Аналогичные сообщения SO.
what-is-convertview-parameter-in-arrayadapter-getview-method
how-do-i-choose-convertview-to-reuse
how-does-the-getview-method-work-when-creating-your-own-custom-adapter