Навигация по сайту

Популярные статьи

Оптимізація прокрутки вкладених в один одного RecyclerView - ziginsider - Нотатки Android

Замітка заснована на статті Ninad MG "Optimizing Nested RecyclerView" .

RecyclerView забезпечує плавну прокрутку списку шляхом приміщення ViewHolder'ов пішли за межі екрану елементів в так званий пул (Pool). Далі, при появі нових елементів, RecyclerView не створює їх заново, але використовує ViewHolder'и з пулу, надуваючи (inflate) їх актуальними даними. Таким чином досягається переіспользованіe ViewHolder'а і підвищується проізводетельность фреймворка.

NB: для більш повної картини проблеми продуктивності в RecyclerView см. Розділ "Життя і смерть ViewHolder'а" в даній замітці . + Розділ "Bonus" в цій замітці .

Отже, іноді, для створення деяких макетів, нам необхідно вкладати один RecyclerView в інший. Розглянемо випадок, коли горизонтальні RecyclerView вкладені в вертикальний.

Коли ви прокручівавете вкладені горизонтальні списки то прокрутка буде плавною, але якщо прокручувати вертикальний список - прокрутка може пригальмовувати. Це відбувається від того, що у кожного RecyclerView свій пул ViewHolder'ов. І кожен раз, при прокручуванні вертикального списку, горизонтальні будуть заново створювати свої ViewHolder'и.

Ми можемо виправити цю ситуацію, розділивши між усіма RecyclerView один пул ViewHolder'ов.

Це робиться за допомогою функції RecyclerView.setRecycledViewPool (RecycledViewPool):

Тепер, коли у всіх вкладених RecyclerView один пул ViewHolder'ов, вони використовують ViewHolder'и один одного, і прокрутка стає більш плавною.

Але прокрутку можна оптимізувати ще більше.

По-перше, конкретного типу View, можна задати максимальну кількість ViewHolder'ов, які будуть зберігається в пулі:

Таким чином, ми можемо підкоригувати (тобто збільшити) максимальні значення кількості в пулі тих ViewHolder'ов, яких в кожен момент на екрані більше, враховуючи той факт, що за замовчуванням ця кількість дорівнює п'яти.

По-друге, починаючи з support library 25.1.0 у нас є можливість вказати layoutManager'ам внутрішніх RecyclerView скільки View потрібно підготувати перед появою на екрані:

де N - це кількість видимих ​​View.

Таким чином, якщо на екрані внутрішні горизонтальні списки за раз показують мінімум три з половиною View, ми можемо написати так:

NB: По-замовчуванню дане N = 2

Це дозволяє внутрішнім RecyclerView створювати свої View на ранній стадії, що підвищує продуктивність при прокручуванні зовнішнього списку.