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

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

Аптымізацыя пракруткі ўкладзеных ў адзін аднаго 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 на ранняй стадыі, што павышае прадукцыйнасць пры прагортцы вонкавага спісу.