Методы getViewTypeCount и getItemViewType для ArrayAdapter

Может ли кто-нибудь из простых слов объяснить мне использование методов getViewTypeCount() и getItemViewType() ArrayAdapter?

Ответ 1

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

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}

Структура использует ваш тип представления, чтобы решить , какие представления передают вам через convertView в вашем методе getView. Другими словами, в приведенном выше примере ваши четные строки будут получать только переработанные виды с изображениями с левой стороны для повторного использования, а нечетные строки будут иметь только изображения с картинками справа.

Если каждая строка в вашем списке имеет тот же макет, вам не нужно беспокоиться о типах просмотров. Фактически BaseAdapter.java обеспечивает поведение по умолчанию для всех адаптеров:

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}

Это действительно дает вам тот же тип вида для каждой строки.

Изменить - для выделения общего потока:

  • Вы привязываете данные к вашему AdapterView с помощью адаптера.
  • AdapterView пытается отобразить элементы, которые видны пользователю.
  • Framework вызывает getItemViewType для строки n, строки, которую он собирается отобразить.
  • Framework проверяет свой переработанный пул представлений для видов типа n. Он не находит никого, потому что никакие представления еще не переработаны.
  • getView вызывается для строки n.
  • Вы вызываете getItemViewType для строки n, чтобы определить, какой вид просмотра вы должны использовать.
  • Вы используете инструкцию if/switch для раздувания другого XML файла в зависимости от типа вида.
  • Вы заполняете представление информацией.
  • Вы возвращаете представление, выходя из getView, и ваше представление строки отображается пользователю.

Теперь, когда представление перерабатывается путем прокрутки экрана, оно переходит в переработанный пул представлений, который управляется инфраструктурой. Они по существу организованы по типу вида, так что представление правильного типа дается вам в параметре convertView в вашем методе getView:

  • Структура снова вызывает getItemViewType для строки, которую она хочет отобразить.
  • На этот раз в переработанном пуле соответствующего типа есть вид.
  • Переработанное представление передается вам как параметр convertView вашему методу getView.
  • Вы заполняете переработанное представление новой информацией и возвращаете ее.

Ответ 2

Если нам нужно показать другой тип представления в представлении списка, тогда полезно использовать getViewTypeCount() и getItemViewType() в адаптере вместо переключения вида View.GONE и View.VISIBLE может быть очень дорогостоящей задачей внутри getView(), который повлияет на прокрутку списка.

Пожалуйста, проверьте это для использования getViewTypeCount() и getItemViewType() в адаптере.

Ссылка: the-use-of-getviewtypecount

Ответ 3

Watch Outttt!!!!
Мне пришлось столкнуться с проблемой реализации ListView вчера, и два вида представлений для строк разошлись сразу после ее прокрутки. Несмотря на то, что верхний проголосовавший ответ в этом потоке дает хорошее общее объяснение, он не выделил самый важный бит информации, чтобы остановить описанную выше ошибку UI.

Вот мое объяснение:
Оба getViewTypeCount() и getItemViewType() используются методом BaseAdapter getView, чтобы выяснить, какой тип представления должен быть извлечен, возвращен и возвращен. (как объясняется в верхнем ответе в потоке). Но если вы не реализуете эти два метода интуитивно в соответствии с Android API Doc, тогда вы можете столкнуться с проблемой, о которой я упоминал.

Обобщенные рекомендации по реализации:
Чтобы реализовать несколько типов строк Views для ListView, мы должны по существу реализовать методы getItemViewType() и getViewTypeCount(). Документация getItemViewType() дает нам примечание следующим образом:

Примечание. Целые числа должны находиться в диапазоне от 0 до getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPE также может быть возвращен.

Итак, в getItemViewType() вы должны вернуть значения для типа вида, начиная с 0, до последнего типа (количество типов - 1). Например, допустим, у вас есть только три типа просмотров? Поэтому в зависимости от объекта данных для представления вы можете возвращать 0 или 1 или 2 из метода getItemViewType(), например, ноль индекс массива. И поскольку у вас есть три типа просмотров, ваш метод getViewTypeCount() должен вернуть 3.

В любом случае, если вы вернете любые другие целочисленные значения, такие как 1, 2, 3 или 111, 222, 333 для этого метода, вы определенно можете столкнуться с вышеуказанной ошибкой пользовательского интерфейса, которую вы только что разместили, не подчиняясь API-интерфейсу Android API

Если вы не поняли ключ или не смогли решить проблему, и вам нужна дополнительная информация, пожалуйста, прочитайте мой fooobar.com/info/12589/....

Прочтите Android Developer Doc для получения дополнительной информации, вы можете найти подсказку напрямую.

Надеюсь, этот ответ может быть полезен кому-то, чтобы сэкономить много часов.

Ура!!!