Может ли кто-нибудь из простых слов объяснить мне использование методов 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 для получения дополнительной информации, вы можете найти подсказку напрямую.
Надеюсь, этот ответ может быть полезен кому-то, чтобы сэкономить много часов.
Ура!!!