Методы getViewTypeCount и getItemViewType ArrayAdapter

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

3 ответа

Решение

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

@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, и представление вашей строки отображается для пользователя.

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

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

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

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

Обобщенное руководство по внедрению:
Для реализации нескольких типов 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.

Если вы не получили подсказку или все еще не можете решить и нуждаетесь в дополнительной информации, пожалуйста, прочитайте мой подробный ответ в этой теме вопросов и ответов Stackru.

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

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

Ура!!!

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

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

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

Другие вопросы по тегам