ListView getView () вызывается слишком часто - PullRequest
4 голосов
/ 30 марта 2012

У меня есть ListView с кастомами Adapter. Если честно, у меня их много одновременно на экране, и мое устройство Tegra 3 начало отставать, что меня сильно смутило ... Я обнаружил, что в каждом ListView Adapter getView() метод вызывается для всех видимых строк каждые время любая анимация запускается на экране. Это дает мне несколько сотен звонков в секунду! Копая больше, большинство этих вызовов происходит из-за measure() и onMeasure() вызовов родителей ListView s, и - это ключ tke - они бесполезны, потому что все макеты моих ListView s имеют постоянный размер.

Итак, мой вопрос: как устранить эти звонки? Конечно, я хочу оставить только правильные вызовы (вызванные добавлением элементов в Adapter и notifyDataSetChanged()).

Я попробовал почти все, но либо весь список не отрисовывается сам (когда я переопределяю его onMeasure() и вынужден возвращать постоянный размер без вызова super.onMeasure()), либо прекращает обновление через некоторое время.

Ответы [ 4 ]

3 голосов
/ 26 августа 2015

Ну, как вы и сказали, эти звонки вызваны measure() и onMeasure() звонками ListViews родителей, и я уверен, что вы используете height=wrap_content также с wrap_content на высоте, которую ListView будет проверять безостановитесь, если ваш рост изменился.

Таким образом, решение - , чтобы поставить height=fill_parent.Я надеюсь, что это помогло вам.

3 голосов
/ 30 марта 2012

Вот как ListView реализован .. Я не думаю, что это приведет к снижению производительности. При условии, что вы там все делаете правильно ..

Например ..

Не создавайте экземпляр LayoutInflator в методе GetView, делайте это на уровне класса.

И выполняйте инфляционное представление, только если convertView==null или просто просто верните convertView .. Раздувание представления является дорогостоящимпроцесс ....

3 голосов
/ 30 марта 2012

Как вы реализовали метод getView ()? Если вы правильно его реализуете, отставания почти не должно быть.

Посмотрите это действительно хорошее видео:

Как сказал Ромен, работай с ним не против. Лучше всего оставить measure () в покое и сосредоточиться на вашем адаптере.

2 голосов
/ 18 марта 2013

Основная причина этого заключается в том, что ListView.onMeasure() вызывает AbsListView.obtainView(), что будет запрашивать представление у вашего адаптера списка. Так что, если ваш вид переизмеряется с помощью анимации, ваша производительность будет очень плохой.

...