Может кто-нибудь в простых словах объяснить мне использование 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;
}
Это действительно дает вам один и тот же тип представления для каждой строки.
Изменить - обрисовать общий ход:
AdapterView
использованием адаптера.AdapterView
пытается отобразить элементы, которые видны пользователю.getItemViewType
строки n
, строки, которую он собирается отобразить.n
. Это не находит, потому что никакие представления еще не были переработаны.getView
называется для ряда n
.getItemViewType
строку, n
чтобы определить, какой тип представления следует использовать.getView
, и представление вашей строки отображается пользователю.Теперь, когда представление перерабатывается путем прокрутки экрана, оно переходит в пул переработанных представлений, который управляется платформой. По сути, они организованы по типу представления, поэтому представление правильного типа дается вам в convertView
параметре вашего getView
метода:
getItemViewType
строку, которую хочет отобразить.convertView
параметра вашего getView
метода.
Если нам нужно показать другой тип представления в представлении списка, тогда его лучше использовать
getViewTypeCount()
иgetItemViewType()
в адаптере вместо переключения представленияView.GONE
иView.VISIBLE
может быть очень дорогой задачей внутри,getView()
что повлияет на прокрутку списка.Пожалуйста, проверьте это для использования
getViewTypeCount()
иgetItemViewType()
в адаптере.Ссылка: the-use-of-getviewtypecount
источник
Смотри Outttt !!!!
Мне пришлось столкнуться с проблемой реализации
ListView
вчерашнего дня, и сразу после прокрутки смешались два вида представлений строк. Несмотря на то, что голосование с наибольшим количеством голосов в этой теме дает хорошее общее объяснение, оно не выделило наиболее важную информацию, чтобы остановить вышеупомянутую ошибку пользовательского интерфейса, о которой я упоминал.Вот мое объяснение:
Как
getViewTypeCount()
и вgetItemViewType()
настоящее время используетсяBaseAdapter
«sgetView
способ выяснить , какой тип зрения следует извлечь, переработанная и вернулся. (как объяснено в верхнем ответе в теме). Но если вы не реализуете эти два метода интуитивно в соответствии с Doc Android API, вы можете столкнуться с проблемой, о которой я упоминал.Обобщенная Руководство по осуществлению:
Для реализации нескольких типов
Views
дляListView
строк «S мы имеем по существу реализовать,getItemViewType()
иgetViewTypeCount()
методы. ИgetItemViewType()
документация дает нам Примечание следующим образом:Таким образом,
getItemViewType()
вы должны вернуть значения для Типа Представления, начиная с 0, до последнего типа как (количество типов - 1). Например, допустим, у вас есть только три типа представлений? Таким образом, в зависимости от объекта данных для представления, вы можете вернуть только 0 или 1 или 2 изgetItemViewType()
метода, как индекс массива с нуля. И так как у вас есть три типа представлений, вашgetViewTypeCount()
метод должен возвращать 3.В любом случае, если вы вернете любые другие целочисленные значения, такие как 1, 2, 3 или 111, 222, 333 для этого метода, вы определенно можете столкнуться с вышеуказанной ошибкой пользовательского интерфейса, которую вы только что установили, не подчиняясь Документу API Android.
Если вы не получили подсказку или все еще не можете решить и нуждаетесь в дополнительной информации, пожалуйста, прочитайте мой подробный ответ в этой теме вопросов и ответов StackOverflow .
Прочитайте Документ разработчика Android для получения дополнительной информации, которую вы могли бы найти ключ непосредственно.
Надеюсь, что этот ответ может быть полезным для кого-то, чтобы сэкономить много часов !!!
Ура !!!
источник
IGNORE_ITEM_VIEW_TYPE
что у меня была ошибка в одном из моих ListView. Я использовал ArrayAdapter для вставки вида, состоящего из 1 изображения и 2 текстового представления. У меня был только один тип просмотра. Я пытался либо не переопределить метод getItemViewType, либо переопределить его, возвращая позицию или жестко запрограммированное целое число. Во всех случаях в моем списке возникали дубликаты со странным поведением при прокрутке (изменения дубликатов). ВозвращениеIGNORE_ITEM_VIEW_TYPE
в метод исправило проблему. Спасибо.