Настраиваемый метод getView адаптера listview, который вызывается несколько раз и не имеет когерентного порядка

У меня есть настраиваемый адаптер списка:

class ResultsListAdapter extends ArrayAdapter<RecordItem> { 

В переопределенном методе getView я делаю печать, чтобы проверить, какая позиция и является ли она конвертируемой или нет:

  @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView " + position + " " + convertView); 

Результат этого (когда список сначала отображается, пока пользователь не вводит пользователя)

 04-11 16:24:05.860: INFO/System.out(681): getView 0 null 04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8 04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8 04-11 16:25:50.251: INFO/System.out(681): getView 1 null 04-11 16:26:01.300: INFO/System.out(681): getView 2 null 04-11 16:26:02.020: INFO/System.out(681): getView 3 null 04-11 16:28:28.091: INFO/System.out(681): getView 0 null 04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0 

AFAIK, хотя я не мог найти это явно, getView () вызывается только для видимых строк. Поскольку мое приложение начинается с четырех видимых строк, по крайней мере, цифры позиций, циклически изменяющиеся от 0-3, имеют смысл. Но все остальное – беспорядок:

  • Почему getview вызывается для каждой строки три раза?
  • Где эти конверсионные сигналы появляются, когда я еще не прокручивал?

Я немного поработал, и, не получив хорошего ответа, я заметил, что люди связывают эту проблему с проблемами макета. Итак, в случае, вот макет, содержащий список:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/pageDetails" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="false" /> </LinearLayout> 

И расположение каждой отдельной строки:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="108dp" android:padding="4dp"> <ImageView android:id="@+id/thumb" android:layout_width="120dp" android:layout_height="fill_parent" android:layout_alignParentTop="true" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginRight="8dp" android:src="@drawable/loading" /> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="18dp" android:layout_toRightOf="@id/thumb" android:layout_alignParentBottom="true" android:singleLine="true" /> <TextView android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="18dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:paddingRight="4dp" android:singleLine="true" /> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="17dp" android:layout_toRightOf="@id/thumb" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:paddingRight="4dp" android:layout_alignWithParentIfMissing="true" android:gravity="center" /> </RelativeLayout> 

Спасибо за ваше время

Это не проблема, нет абсолютно никакой гарантии того порядка, в котором будет вызываться getView() , и сколько раз. В вашем конкретном случае вы делаете самое худшее с помощью ListView , предоставляя ему height=wrap_content . Это заставляет ListView измерять несколько детей из адаптера во время компоновки, чтобы знать, насколько это важно. Это то, что предоставляет ListView с convertViews ListView convertViews вы видите переданными getView() даже перед прокруткой.

Попробуйте с match_parent в layout_height списка. Это предотвратит getView() .

Я избавился от этой проблемы, когда я сменил layout_width и layout_height на match_parent (изменение только layout_height не помогло).


Обратите внимание , если у вас есть вложенные элементы. Вы должны изменить «самый высокий» на match_parent . Надеюсь, это поможет кому-то.

Я не могу ответить на ваш вопрос «Почему», но у меня определенно есть решение проблемы раздражающей проблемы « ListView items repeating » (если у вас есть элементы в коллекции ур, которые больше, чем высота экрана).

Как уже упоминалось выше, сохраните свойство android: layout_height тега ListVew как fill_parent .

И о функции getView (), решение заключается в использовании статического класса, называемого ViewHolder . Проверьте этот пример. Он успешно выполняет задачу добавления всех элементов в массиве ur или ArrayCollection.

Надеюсь, это поможет друзьям!

С наилучшими пожеланиями, Сиддхант

Ques: Почему Adapter вызывает getView () многократно? Ans: По мере того, как Listview рендерит на прокрутку, он обновляется с помощью следующих будущих просмотров, для которых адаптер должен получать представления, вызывая getView ().

Ques: Почему это вызовы меньше, если ширина и высота списка заданы как fill_parent? Ans: Потому что, поскольку инфлятор имеет фиксированный размер для области экрана для списка, он вычисляет один раз для визуализации представлений на экране.

Надеюсь, он решит ваш запрос.

У меня была такая же проблема с выпадающим списком в AutoCompleteTextView. Я боролся с проблемой в течение двух дней, пока не приеду сюда, и вы покажете мне решение.

Если я напишу dropDownHeight = "match_parent", проблема будет исправлена. Теперь проблема связана с UI (когда у вас есть один элемент, выпадающий список слишком большой), но проблема множественных вызовов (гораздо важнее) исправлена.

Спасибо!!

«Почему getview вызывается для каждой строки три раза?» Поскольку getView вызывается, когда вы прокручиваете список и лучше говорите, что он вызывается, когда позиция вида вашего списка изменяется!

У меня такая же проблема. Если у меня высота установлена ​​на fill_parent, тогда я получаю «обычно» 2 вызова в строке. Но если я установил высоту моего ListView на точное значение, скажем 300dp, то я получаю ровно один вызов GetView для каждой строки.

Итак, мне кажется, что единственный способ – сначала определить высоту экрана, а затем программно установить высоту listvilew для этого значения. Мне это не нравится. Надеюсь, что есть лучший способ.

Для всех вас, кто еще (после установки height ListView to match_parent ) застревает (как и я):

Вы также должны установить height родительского макета для match_parent .

См. Пример ниже. LinearLayout является родителем здесь:

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/something" /> <ListView android:id="@+id/friendsList" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 
Intereting Posts
Хорошо ли заменить широковещательный приемник с помощью Greenrobot Eventbus для запуска функций на основе событий и передачи данных от службы к активности? Локализация имени пользователя в приложении Android для разных локалей OpenGL ES 2.0 Несколько программ или несколько шейдеров или что? Как это работает? Как открыть приложение Twitter и Facebook с помощью Phonegap? Как объединить изображение с помощью библиотеки Glide? Phonegap 3.0 Media API – сломан? Realm, RxJava, asObservable () и doOnUnsubscribe () Gradle Artifactory Plugin – Как публиковать артефакты из нескольких модулей в проекте? ImageView показывает белое пространство сверху и снизу изображения Округленный угол для текста в андроиде Android – как открыть толковое уведомление о намерениях глубокой ссылки, которое при закрытии возвращается на главный экран? Как я могу объединить между ветвями, когда имя пакета отличается? Обнаружить лицо из изображения и обрезать лицо с этой фотографии RuntimeException: собственный шрифт не может быть создан или утечка памяти для пользовательского шрифта загрузки TextView Crosswalk Cordova Выбор нескольких файлов Android