AFAIK, хотя я не смог найти, что это указано явно, getView () вызывается только для видимых строк. Поскольку мое приложение запускается с четырьмя видимыми строками, по крайней мере, номера позиций, изменяющиеся от 0 до 3, имеют смысл. Но в остальном полный бардак:
Почему getview вызывается для каждой строки три раза?
Откуда берутся эти convertViews, когда я еще не прокручивал?
Я провел небольшое исследование и, не получив хорошего ответа, заметил, что люди связывают эту проблему с проблемами макета. Итак, на всякий случай, вот макет, содержащий список:
Это не проблема, нет абсолютно никакой гарантии в том порядке, в котором getView() будет вызываться, и сколько раз. В вашем конкретном случае вы делаете худшую вещь из возможных с помощью ListView , предоставляя ему height=wrap_content. Это вынуждает ListView измерять несколько дочерних элементов адаптера во время компоновки, чтобы знать, насколько большим он должен быть. Это то, что обеспечивает передачу ListView того, convertViews что вы видите, getView() еще до прокрутки.
Ответ 2
Попробуйте с помощью match_parent свойства layout_height представления списка. Это предотвратит getView() частые вызовы.
Ответ 3
Я избавился от этой проблемы, когда изменил layout_width и layout_height на match_parent (изменение только layout_height не помогло).
Полезное примечание будьте осторожны, если у вас есть вложенные элементы. Вам нужно изменить "самый высокий" на match_parent. Надеюсь, это кому-нибудь поможет.
Ответ 4
Я не могу ответить на ваш вопрос "Почему", но у меня определенно есть решение проблемы раздражающего "повторяющиеся элементы ListView" (если у вас в коллекции есть элементы, размер которых превышает высоту экрана).
Как упоминали многие люди выше, сохраните свойство android:layout_height тега ListVew как fill_parent.
Что касается функции getView(), то решение заключается в использовании статического класса с именем ViewHolder. Посмотрите на этот пример. Он успешно выполняет задачу добавления всех элементов в ur Array или ArrayCollection.