Переиспользование блоков на Android

Переиспользование блоков в DivKit происходит при следующих событиях:

Переиспользование при установке новой DivData

DivKit всегда пытается переиспользовать уже созданные элементы.

Если структуры DivData совпадают

Структура старой DivData:

 - container
  - image
    - url: "old_image"
  - text
   - text: "old_text"

Структура новой DivData:

 - container
  - image
    - url: "new_image"
  - text
    - text: "new_text"

В таком случае, при установке новой DivData, DivKit просто заменит данные внутри view, потому что структура дерева не изменилась.
Это быстрый и предпочтительный процесс при установке DivData.

Если структуры не совпадают

Структура старой DivData:

 - container
  - image

Структура новой DivData:

- container
  - video

В таком случае, DivKit уничтожит уже созданные view и создаст новые. Этот процесс занимает больше времени, по сравнению с переиспользованием.
Стоит учитывать данный момент при проектировании вёрстки.

Переиспользование в сложных контейнерах

DivKit переиспользует контейнеры списков в порядке их освобождения.

Допустим, ваша галерея состоит из однотипных элементов и на экране виден только один элемент за раз:

- gallery
  - container
    - image
    - text
  - container
    - image
    - text
  - container
    - image
    - text

Тогда, при переключении на второй элемент, первый будет освобождён и переиспользован DivKit при загрузке третьего элемента.
Установка данных будет происходить соответственно переиспользованию при установке новой DivData.

Поэтому переиспользование по умолчанию не сработает, если элементы вашего списка имеют разную структуру. Например:

- gallery
  - container
    - video
    - text
  - container
    - image
    - text
  - container
    - image
    - text
  - container
    - video
    - text

Контейнер 1 не сможет быть переиспользован при создании третьего элемента, а 2-й при создании 4.
В итоге, тяжёлый объект video будет зря уничтожен и пересоздан.

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

Пример:
{
    "type": "gallery",
    "items": [
        {
            "type": "container",
            "reuse_id": "video_block",
            "items": [
                {
                    "type": "video",
                    ...
                }
            ]
        },
        {
            "type": "container",
            "reuse_id": "image_block",
            "items": [
                {
                    "type": "image",
                    ...
                }
            ]
        },
        {
            "type": "container",
            "reuse_id": "image_block",
            "items": [
                {
                    "type": "image",
                    ...
                }
            ]
        },
        {
            "type": "container",
            "reuse_id": "video_block",
            "items": [
                {
                    "type": "video",
                    ...
                }
            ]
        }
    ]
}

Внимание! DivKit не проверяет одинакова ли структура элементов с одинаковыми reuse_id. При установке одинаковых reuse_id для элементов с разной структурой блок будет стёрт и сформирован заново. Так, будто reuse_id не был установлен.

Узнать больше

Следите за новостями DivKit в Telegram-канале: http://t.me/divkit_news.

Также вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.

Репозиторий DivKit

Следующая