> For the complete documentation index, see [llms.txt](https://programmingfundamental.gitbook.io/programmingwithjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://programmingfundamental.gitbook.io/programmingwithjava/programirane-za-mobilni-i-internet-ustroistva/laboratorno-uprazhnenie-7/recyclerview.md).

# RecyclerView

## RecyclerView

RecyclerView е създаден за да подобри работат със списачни данни, като подобрява ListView и GridView.

### При работа с RecyclerView се използват:

* `RecyclerView.Adapter` - За да обработи колекцията с данни и да свърже данните с изгледа
* `LayoutManager` - Помага при позиционирането на елементите
* `ItemAnimator` - Помага при анимиране на обичайни операции като добавяне или премахване на елементи от списъка
* `ViewHolder Pattern` - За подобряване на производителността, чрез кеширане на изгледа, за по-гладко търсене и по-бързо зареждане на елемент.

### Компоненти на RecyclerView

#### LayoutManagers

RecyclerView приема като параметри мениджър на оформление и адаптер, за да бъде създаден. Мениджърът на оформление (LayoutManagers) управлява елементи вътре в RecyclerView и определя кога да се скриват и показват елементи. Пример за работата на LayoutManagers е показването и скриването на елементи по време на скрол, той оптимизира паметта използвана от приложението.

**Видове:**

* `LinearLayoutManager` - показва елементи във вертикален или хоризонтален списък.
* `GridLayoutManager` - показва елементите в матрична решетка.
* `StaggeredGridLayoutManager` - показва елементите в шахматна решетка.

#### RecyclerView\.Adapter

RecyclerView използва специфичен вид адаптер. Това е подобен подход на вече използваните, но с някои особености, като например ViewHolder. Трябва да се имплементират два основни метода: един, за попълване на изгледа, и друг за свърване данните с изгледа.

* onCreateViewHolder -  Приема като входни параметри родителски ViewGrop обект, в който ще се зарежда списъка с View обекти и тип на изгледа. Създава и връща като резултат RecyclerView\.ViewHolder, обект на изгледа, който ще се добави към RecyclerView.
* onBindViewHolder - Инициализиране на данните в RecyclerView\.ViewHolder обекта, който се създава от onCreateViewHolder. Приема като входни данни RecyclerView\.ViewHolder обект и позицията в  RecyclerView, където ще се позиционира този елемент.
* getItemCount - връща като резултат броя на данните в колекцията, която ще се визуализира в RecyclerView

#### Промяна на данните в ResicleView

Всеки път, когато искаме да добавяме или премахваме елементи от RecyclerView, ще трябва да уведомим изрично адаптера за събитието. Има няколко методи, които да се използват при уведомяване на адаптера за различни промени:

| Метод                       | Описание                                            |
| --------------------------- | --------------------------------------------------- |
| notifyItemChanged(int pos)  | Уведомява, че елемента на тази позиция е променен.  |
| notifyItemInserted(int pos) | Уведомява, че на това място е добавен елемент.      |
| notifyItemRemoved(int pos)  | Уведомява, че елемента от тази позиция е премахнат. |
| notifyDataSetChanged()      | Уведомява, че колекцията от данни е променена.      |

### RecyclerView\.ViewHolder

В RecyclerView\.ViewHolder се описва изглед на елемент и метаданни за неговото място в рамките на RecyclerView
