У меня есть собственный адаптер списка:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
в переопределенном методе getView я делаю печать, чтобы проверить, какая позиция и является ли она convertView или нет:
@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 вызывается для каждого ряда три раза?
- Откуда приходят эти convertView, когда я еще не прокрутил?
Я сделал небольшой поиск и, не получив хорошего ответа, заметил, что люди связывают эту проблему с проблемами компоновки. Так что в случае, вот макет, который содержит список:
<?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>
Спасибо за уделенное время
ListView
имеет высотуwrap_content
, так что не уверена в его высоту поэтому лежит несколько детей, как своего рода тестер , чтобы увидеть , что будет вписываться в. Измените ваш ,ListView
чтобыfill_parent
затем проверить журналы звонки должны быть резко сокращены.Попробуйте с
match_parent
помощьюlayout_height
свойства списка. Это помешаетgetView()
так часто звонить.источник
fill_parent
следует заменитьmatch_parent
на API уровня 8 и выше.Я избавился от этой проблемы, когда изменил layout_width и layout_height на match_parent (изменение только layout_height не помогло).
Полезное примечание, обратите внимание , если у вас есть вложенные элементы. Вы должны изменить самый высокий на match_parent . Надеюсь, это кому-нибудь поможет.
источник
wrap_content
, тоListView
не знаю , сколько элемента списка есть , чтобы стать содержанием Листа, то почемуListView
пытается создать стольких строк , как он думает , что пригодны для отображения, а также при использованииfill_parent
илиmatch_parent
,ListView
думает, хорошо, мой рост этоx
и мне нужноn
несколько строк , чтобы показать.Я не могу ответить на ваш вопрос «почему», но у меня определенно есть решение проблемы раздражающих элементов ListView, повторяющихся » (если в вашей коллекции есть элементы, размер которых превышает высоту экрана).
Как уже упоминали многие люди, оставьте свойство android: layout_height тега ListVew как fill_parent .
Что касается функции getView (), решение состоит в том, чтобы использовать статический класс с именем ViewHolder . Проверьте этот пример. Он успешно выполняет задачу добавления всех элементов в массив Array или ArrayCollection.
Надеюсь, это поможет друзьям!
С наилучшими пожеланиями, Сиддхант
источник
GridView
и измененияandroid:layout_height
иandroid:layout_width
не работает для меня. Но используяViewHolder
фиксированные повторяющиеся изображения для меня, я прошел этот урок android-vogue.blogspot.com/2011/06/…Вопросы: почему адаптер вызывает getView () много раз? Ответ: Поскольку визуализация Listview при прокрутке обновляет его представление следующими предстоящими представлениями, для которых адаптер должен получать представления, вызывая getView ().
Ques: Почему он вызывает меньше, если ширина и высота списка просмотра установлена в fill_parent? Ответ: Поскольку инфлятор имеет фиксированный размер области экрана для списка, он рассчитывает один раз для визуализации представлений на экране.
Надеюсь, это разрешит ваш запрос.
источник
У меня была такая же проблема с выпадающим в AutoCompleteTextView. Я боролся с проблемой в течение двух дней, пока я не приехал сюда, и вы не показали мне решение.
Если я напишу dropDownHeight = "match_parent", проблема исправлена. Теперь проблема связана с пользовательским интерфейсом (когда у вас есть один элемент, раскрывающийся список слишком велик), но проблема множественных вызовов (гораздо важнее) устранена.
Спасибо!!
источник
"Почему getview вызывается для каждого ряда три раза?" Потому что getView вызывается, когда вы прокручиваете список, и лучше сказать, что он вызывается при изменении позиции представления вашего списка!
источник
У меня та же проблема. Если у меня установлена высота fill_parent, то я получаю «обычно» 2 вызова на строку. Но если я установлю высоту моего ListView на точное значение, скажем, 300dp, то я получу ровно один вызов GetView на строку.
Поэтому мне кажется, что единственный способ - сначала определить высоту экрана, а затем программно установить высоту listvilew на это значение. Мне это не нравится Я надеюсь, что есть лучший способ.
источник
Для всех, кто до сих пор (После установки
height
изListView
кmatch_parent
) застряли (как я):Вы также должны установить
height
родительский макет вmatch_parent
.Смотрите пример ниже.
LinearLayout
Является родителем здесь:источник
Это может быть поздно, но если вы используете, не
layout_weight
забывайте всегда устанавливатьlayout_width="0dp"
источник
Я сделал это решение, может быть, не самое лучшее, но делает работу ...
тогда =
Надеюсь, поможет!
источник