---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.3
alternate:
  - https://divkit.tech/docs/en/concepts/reuse/android.md
  - https://divkit.tech/docs/ru/concepts/reuse/android.md
---
> **Documentation Index:** Fetch the complete configuration index at https://divkit.tech/docs/ru/llms.txt

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

Переиспользование блоков в DivKit происходит при следующих событиях:
- [Установка новой DivData](#new-div-data).
- [Cкроллинг элементов в сложных контейнерах](#recycler-container): `gallery`, `grid`, `tabs`.

## Пользовательские компоненты (div-custom)

При работе с пользовательскими компонентами (`div-custom`) на Android, все операции создания и привязки представлений гарантированно выполняются в основном UI-потоке. Это обеспечивает потокобезопасность и корректную работу пользовательских интерфейсов.

**Гарантии выполнения в UI-потоке:**
- Проверка поддержки пользовательского типа (`isCustomTypeSupported`)
- Создание пользовательского представления (`createView`)
- Привязка пользовательского представления (`bindView`)

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

## Переиспользование при установке новой DivData {#new-div-data}

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

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

Структура старой DivData:
```translate=no
 - container
  - image
    - url: "old_image"
  - text
   - text: "old_text"
```

Структура новой DivData:
```translate=no
 - container
  - image
    - url: "new_image"
  - text
    - text: "new_text"
```

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


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

Структура старой DivData:
```translate=no
 - container
  - image
```

Структура новой DivData:
```translate=no
- container
  - video
```

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

## Переиспользование в сложных контейнерах {#recycler-container}

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

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

```translate=no
- gallery
  - container
    - image
    - text
  - container
    - image
    - text
  - container
    - image
    - text
```

Тогда, при переключении на второй элемент, первый будет освобождён и переиспользован DivKit при загрузке третьего элемента.
Установка данных будет происходить соответственно переиспользованию при [установке новой DivData](#new-div-data).

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

```translate=no
- gallery
  - container
    - video
    - text
  - container
    - image
    - text
  - container
    - image
    - text
  - container
    - video
    - text
```

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

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

{% cut "Пример:" %}

```json translate=no
{
    "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",
                    ...
                }
            ]
        }
    ]
}
```

{% endcut %}

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

<!-- source: ru/_includes/index/troubleshooting.md -->
## Узнать больше {#troubleshooting}

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



[Репозиторий DivKit](https://github.com/divkit/divkit)




<!-- endsource: ru/_includes/index/troubleshooting.md -->
