Подтвердить что ты не робот

Какова цель `конвертирования 'в адаптере ListView?

В андроиде я обычно использую MyAdapter extends ArrayAdapter для создания представления для ListView, и в результате я должен переопределить функцию

public View getView(int position, View convertView, ViewGroup parent) {
    // somecode here
}

Однако я не знаю точно, что делают convertView и parent! У кого-нибудь есть предложение? Подробнее, больше помощи! Спасибо!

4b9b3361

Ответ 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