2013-05-14 4 views
0

У меня есть ListView, и я ввел следующий код, чтобы увидеть процесс getView() моего BaseAdapter.Адаптер ListView getView() получает неправильный элемент

@Override 

public View getView(int position, View convertView, ViewGroup parent) { 

    Log.d("getView()","Fetching Row: " + position); 
    ... 
} 

Поскольку я медленно прокручиваю свой список, я замечаю что-то странное. Даже когда я нахожусь в позиции списка 40-50, он все равно вызывает getView() с позицией 0-7. Вот то, что мой журнал выглядит следующим образом:

05-14 11:46:13.989: I/getView()(18681): Fetching Row: 45 
05-14 11:46:14.039: I/getView()(18681): Fetching Row: 0 
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 1 
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 2 
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 3 
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 4 
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 5 
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 6 
05-14 11:46:14.069: I/getView()(18681): Fetching Row: 7 
05-14 11:46:14.320: I/getView()(18681): Fetching Row: 46 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 0 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 1 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 2 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 3 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 4 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 5 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 6 
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 7 

Как вы можете видеть, в между рядами 45 и ряд 46, он называется GetView() для строки 0-7, каждый раз. Это происходит для каждого элемента списка. Я боюсь, что это вызывает проблемы с производительностью.

Почему это происходит? И это нормальное поведение?

ответ

5

В вашем списке следует изменить XML layout_height к android:layout_height="match_parent"

+1

Ничего себе, не мог бы подумать, что это так просто. Спасибо за решение! Вы знаете, почему настройка android: layout_height = "wrap_content" заставляет listview делать это? – baekacaek

+3

Макет получает пересчет каждый раз из-за wrap_content. –

+0

О, я вижу. Еще раз спасибо – baekacaek

1

Это нормальное поведение. ListView имеет ряд внутренних оптимизаций, чтобы фактически повысить производительность - один из них - переработать представления и отображать только строки, которые на самом деле находятся на экране. Другими словами, ListView не работает, отображая все x количество просмотров в вашем адаптере, а затем просто перемещайте их по экрану. Скорее, он создает представления по мере их отображения. Вот почему, когда вы находитесь в пункте 45 в своем списке, он все еще ссылается на эти строки как на пункты с 0 по 7. ListView отображает только 7 или 8 просмотров за раз, то есть то, что подходит на экране, даже если ваш адаптер содержит многое другое. Это имеет большое значение, поскольку ваши списки становятся длиннее, так как это экономит устройство от необходимости визуализировать каждый вид заранее.

В результате получить одно из видов немного сложнее, чем просто использовать getView(), поскольку в зависимости от длины списка существует хорошая вероятность, что он может не существовать.

Смежные вопросы