Методы 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;
}
Это действительно дает вам один и тот же тип представления для каждой строки.
Редактировать - для обрисовки общего потока:
- Вы привязываете данные к своему
AdapterView
используя адаптер. -
AdapterView
пытается отобразить элементы, которые видны пользователю. - Фреймворк вызывает
getItemViewType
для рядаn
, строка, которую он собирается отобразить. - Платформа проверяет свой переработанный пул представлений на предмет просмотра строк
n
тип. Это не находит, потому что никакие представления еще не были переработаны. getView
называется для строкиn
,- Ты звонишь
getItemViewType
для рядаn
чтобы определить, какой тип зрения вы должны использовать. - Вы используете оператор if / switch для раздувания другого xml-файла в зависимости от того, какой тип представления требуется.
- Вы заполняете представление информацией.
- Вы возвращаете вид, выходя
getView
, и представление вашей строки отображается для пользователя.
Теперь, когда представление перерабатывается путем прокрутки экрана, оно переходит в пул переработанных представлений, который управляется платформой. По сути, они организованы по типу представления, поэтому представление правильного типа дается вам в convertView
параметр в вашем getView
метод:
- Фреймворк снова вызывает
getItemViewType
для строки, которую он хочет отобразить. - На этот раз есть вид на переработанный пул соответствующего типа.
- Восстановленный вид передается вам как
convertView
параметр вашегоgetView
метод. - Вы заполняете переработанное представление новой информацией и возвращаете ее.
Смотри 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