Статьи

Android: плавная прокрутка списка

Если бы мне пришлось сравнивать iOS с Android и перечислять только одно существенное преимущество, которое iOS имеет перед Android, это была бы производительность прокрутки списка, руки вниз ( и я не единственный , или два , или три, чтобы сказать это…).

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

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

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

Пытаясь улучшить производительность прокрутки Android с помощью списка раз, важно понимать следующие несколько моментов:

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

Вот несколько быстрых оптимизаций, которые вы можете сделать, чтобы получить максимальный прирост производительности за потраченное время.

Первая оптимизация является самой распространенной: The View Holder. Это уменьшает количество объектов, которые вы должны создавать при прокрутке, и значительно сокращает некоторые дорогостоящие вызовы пользовательского интерфейса. Одна только эта оптимизация приведет к увеличению производительности примерно на 100%. Хороший пример паттерна в действии можно найти здесь .

Еще одна менее используемая оптимизация — рисовать представления только тогда, когда пользователь фактически не прокручивает список. Идея такова: если ваш элемент представления списка состоит из нескольких изображений, некоторого текста и флажка, нужно ли вашему пользователю видеть все эти представления, сгенерированные при прокрутке?

Когда пользователь выполняет прокрутку, вся работа, связанная с вычислением детальных представлений, тратится впустую, и это убивает анимацию прокрутки.

Пользователю также не нужно иметь такое подробное представление прокрутки данных, только возможность определить, где пользователь находится в списке в данный момент. Например, в списке, отсортированном по алфавиту, вы узнаете, где находитесь, проверив текст в списке.

Таким образом, вместо того, чтобы рисовать все эти бесполезные виды при прокрутке, почему бы не нарисовать только текст на виде? Рисуя только самые важные виды, ваш вид списка должен видеть огромный скачок в скорости прокрутки, делая его намного более гладким.

Чтобы приведенный ниже код работал правильно, вам нужно добавить логическое значение (isScrolling) в ваш адаптер . Каждый раз, когда scrollState не равен нулю (или прокрутке), вы устанавливаете это значение в true. Как только прокрутка прекратится, вы можете попросить адаптер перерисовать представления с необходимой информацией.

01
02
03
04
05
06
07
08
09
10
11
12
13
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 () вы можете использовать только что добавленное логическое значение, чтобы определить, нужно ли рисовать какие-либо представления с высокой производительностью, например, изображения или сложные кнопки.

Вышеуказанные две оптимизации обеспечат вам хороший скачок производительности при минимальном затраченном времени.

Знаете ли вы о некоторых других скрытых драгоценных камнях оптимизации для производительности представления списка Android?

Справка: прокрутка списка плавных движений в Android от нашего партнера по JCG Исаака Тейлора в блоге Programming Mobile .