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