Pull to refresh

Советы для профессионального использования RecyclerView. Часть 1

Reading time 3 min
Views 11K
Original author: Arif Khan

Советы для профессионального использования RecyclerView. Часть 1


Я решил написать эту статью, т.к. заметил, что многие разработчики допускают ошибки при использовании RecyclerView, даже несмотря на то, что Google уже довольно давно его выпустила.


Описанные здесь пункты упоминались в различных докладах и материалах на Google Devs.


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


1. Атрибут setHasFixedSize


Установите атрибут recyclerView.setHasFixedSize(true), когда recyclerView не планирует изменять размеры своих дочерних элементов динамически.


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


2. Click listener


Устанавливайте обработчик кликов в onCreateViewHolder(...).


Всякий раз, когда пользователь кликает по элементу списка, viewHolder сообщает позицию адаптера, где этот клик произошёл (vh.getAdapterPosition()). Это важно, потому что элементы могут перемещаться внутри адаптера, и связанные с ними view-компоненты не будут пересоздаваться.


В результате к тому времени, когда view-компонент будет создан, может произойти следующее: элемент списка будет находиться, допустим, на позиции 2, но когда пользователь кликнет на него, элемент будет уже на позиции 5. Таким образом, использование метода vh.getAdapterPosition() гарантирует получение корректного индекса списка.


3. Использование различных типов view-компонентов


Возвращайте напрямую layout в случае использования различных типов view-компонентов (например, R.layout.view_one).


Если ваш адаптер поддерживает различные типы view-компонентов, то метод getItemViewType и onCreateViewHolder будут выглядеть приблизительно так, как изображено ниже. Вам необходимо написать оператор switch внутри метода onCreateViewHolder для реализации нужной логики для соответствующих типов view-компонентов.


Стандартные getItemViewType и onCreateViewHolder


Но вместо этих типов, вы можете вернуть сразу layout. Это избавит вас от шаблонного кода в onCreateViewHolder:


Прокачанный onCreateViewHolder


Этот приём нельзя использовать постоянно, т.к. иногда вам может потребоваться более сложная логика внутри каждого выбранного layout для разных случаев. Но если это не ваш случай, то возвращаемые layout — это верный путь для работы с различными типами view-компонентов.


4. DiffUtil


Используйте DiffUtil для добавления новых данных в RecyclerView.


Всякий раз, когда данные в recyclerView меняются, большинство разработчиков вызывают метод notifyDataSetChanged() для отображения обновлённых данных на UI. Они просто не знают, что данный метод ресурсозатратен, и что именно здесь DiffUtil справляется куда эффективнее.


DiffUtil — это класс-утилита, который может вычислять разницу между двумя списками в виде списка обновлений, который затем конвертирует первый список во второй. Его можно использовать для вычисления обновлений в адаптере recyclerView. Чтобы использовать DiffUtil, вы должны реализовать DiffUtil.Callback, в котором есть несколько обязательных методов, необходимых для реализации логики DiffUtil:


Публичные методы DiffUtil.Callback


Самое большое преимущество DiffUtil заключается в том, что в RecyclerView вы можете обновить конкретный текст в TextView определённого элемента, вместо того, чтобы перерисовывать весь список. Для этого вам необходимо реализовать метод onChangePayload в DiffUtil.Callback. Есть очень хорошая статья на эту тему.


Во второй части рассмотрим другие советы качественного использования RecyclerView.


→ Советы для профессионального использования RecyclerView. Часть 2

Tags:
Hubs:
+4
Comments 4
Comments Comments 4

Articles