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

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

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

 @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; } 

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

Изменить – чтобы определить общий поток:

  1. Вы привязываете данные к вашему AdapterView с помощью адаптера.
  2. AdapterView пытается отобразить элементы, которые видны пользователю.
  3. Структура вызывает getItemViewType для строки n , строки, которую она собирается отобразить.
  4. Фреймворк проверяет свой переработанный пул представлений для видов типа n . Это не находит, потому что пока никаких просмотров не было переработано.
  5. getView вызывается для строки n .
  6. Вы вызываете getItemViewType для строки n чтобы определить, какой вид просмотра вы должны использовать.
  7. Вы используете инструкцию if / switch для раздувания другого XML-файла в зависимости от того, какой тип вида требуется.
  8. Вы заполняете представление информацией.
  9. Вы возвращаете представление, выходя из getView , и представление вашей строки отображается пользователю.

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

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

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

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

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

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

Вот мое объяснение:
И 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.

Если вы не поняли ключ или не смогли решить проблему и нуждаетесь в дополнительной информации, прочитайте мой подробный ответ в этом потоке Q & A StackOverflow .

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

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

Ура !!!

Intereting Posts