Когда я сравниваю iPhone и телефон на Androd, мне в глаза сразу бросается одно отличие. Я говорю о плавности прокрутки списков. На первый взгляд проблема медленной и рваной прокрутки кажется не-такой уж существенной, однако если учесть, что прокручивающиеся списки используются практически в каждом Android приложении, то эта недоработка предстает в абсолютно другом сете. Рваная, подтормаживающая прокрутка существенно влияет на восприятие платформы Android в целом. Это один из аспектов, который заставляет людей думать, что Android находится в позиции догоняющего по отношению к iOS.
К счастью, проблема низкой скорости прокрутки списков в Android вполне решаема. Нужно только не пускать все на самотек, а приложить руки и голову. Если разобраться, iOS разработчики тоже вынуждены тратить время на оптимизацию списков, чтобы добиться гладкой прокрути, просто на Android оптимизация выглядит чуть сложнее.
Когда вы занимаетесь оптимизацией Android приложений, нужно держать в голове несколько ключевых моментов:
Ниже я приведу два приема, которые помогут Вам оптимизировать свои списки.
Первый способ оптимизация широко распространен и им пользуются все мало-мальски грамотные Android разработчики. Он заключается в использовании View Holder-а, что уменьшает количество объектов, которые необходимо создать для списка прокрутки, и исключает вызов нескольких медленных функций пользовательского интерфейса. Использование View Holder-а позволит вам на 100% повысить производительность прокрутки. Хороший пример работы с View Holder-ом приведенздесь.
Еще один оптимизационный трюк - рисовать на экране только когда пользователь не прокручивает список. Именно необходимость просчета нового изображения для строки списка загружает процессор телефона и убивает плавную анимацию. Поясним эту идею. Если строка вашего списка содержит несколько рисунков, текст и checkbox, действительно ли пользователю нужно видеть все это в процессе прокрутки? В процессе прокрутки пользователю совсем не нужны все эти данные. Например, если он работает с отсортированным по алфавиту списком - все что ему нужно это текстовое представление. Так почему бы в процессе прокрутки не выводить только текст, а всю графику и checkbox-ы показать, когда прокрутка завершится. Этот подход позволяет сделать прокрутку во много раз более плавной.
Для того чтобы реализовать эту идею Вам нужно добавить логическую переменную isScrolling в Ваш адаптер. Если параметр scrollState не равен нулю (происходит прокрутка), нужно установить эту переменную в true. После того, как прокрутка закончилась, scrollState принимает значение 0, и Вы должны заставить адаптер перерисовать все строки, чтобы показать подробную информацию. Для этого устанавливаем флаг isScrolling в false и вызываем метод notifyDataSetChanged().
listView.setOnScrollListener(new OnScrollListener(){ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCoun){ public void onScrollStateChanged(AbsListView view, int scrollState){ if(scrollState!=0) listView.getAdapter()).isScrolling=true; else{ listView.getAdapter()).isScrolling=false; listView.getAdapter()).notifyDataSetChanged(); } } });
Этот код нужно добавить в метод listView.getView(). В адаптере в зависимости от значения переменной isScrolling нужно отображать или не отображать содержимое строк.
Описанные приемы позволяют значительно повысить производительность прокрутки списка. Если Вы используете какие-то другие методы оптимизации производительности списков, пожалуйста, поделитесь ими в комментариях.
Источник:Android: Smooth List Scrolling
Перевод:Александр Ледков
Статьи от теме: