Добиваемся плавной прокрутки списков в Android

Плавное скольжениеКогда я сравниваю iPhone и телефон на Androd, мне в глаза сразу бросается одно отличие. Я говорю о плавности прокрутки списков. На первый взгляд проблема медленной и рваной прокрутки  кажется не-такой уж существенной, однако если учесть, что прокручивающиеся списки используются практически в каждом Android приложении, то эта недоработка предстает в абсолютно другом сете. Рваная, подтормаживающая прокрутка существенно влияет на восприятие платформы Android в целом. Это один из аспектов, который заставляет людей думать, что Android находится в позиции догоняющего по отношению к iOS.

К счастью, проблема низкой скорости прокрутки списков в Android вполне решаема. Нужно только не пускать все на самотек, а приложить руки и голову. Если разобраться, iOS разработчики тоже вынуждены тратить время на оптимизацию списков, чтобы добиться гладкой прокрути, просто на Android оптимизация выглядит чуть сложнее.

Когда вы занимаетесь оптимизацией Android приложений, нужно держать в голове несколько ключевых моментов:

  1. Создание нового объекта очень медленная операция.
  2. Слишком частый вызов findViewById может быть не оправдан
  3. Вывод на экран должен осуществляться только тогда, когда это действительно необходимо.


Ниже я приведу два приема, которые помогут Вам оптимизировать свои списки.

Первый способ оптимизация широко распространен и им пользуются все мало-мальски грамотные 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
Перевод:Александр Ледков

Статьи от теме:




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна