Переиспользование блоков на Android
Переиспользование блоков в DivKit происходит при следующих событиях:
- Установка новой DivData.
- Cкроллинг элементов в сложных контейнерах:
gallery
,grid
,tabs
.
Переиспользование при установке новой 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.