Fermer

décembre 17, 2021

Minimiser le nombre d'inflation de mise en page dans l'adaptateur RecyclerView


RecyclerView utilise en interne un ViewPool pour enregistrer les vues de rebut qui ne sont plus visibles à l'écran et peuvent être recyclées. Normalement, chaque recyclerview crée un ViewPool séparé qui est limité à cette recyclerview uniquement. Avec l'aide de #RecyclerView.setRecycledViewPool(), nous pouvons partager un ViewPool sur plusieurs RecyclerViews. Avec cela, nous pouvons réduire le nombre d'inflation de mise en page pour RecyclerView.Adapter. Comme nous le savons, l'inflation de la mise en page est un processus coûteux, ce qui augmentera les performances globales.

Peu de choses importantes à garder à l'esprit lors du partage d'un `ViewPool`.

1. RecycledViewPool n'est pas lié à un contexte, mais puisqu'il stocke des vues, cela équivaut à avoir un contexte de l'activité.
Par conséquent, les vues partagées doivent se trouver dans la même activité. Nous pouvons également partager « ViewPool » au sein de plusieurs activités, mais de cette façon, cela dépasse le cadre d'un contexte qui pourrait provoquer des fuites de mémoire. Par conséquent, il est recommandé de partager un pool de vues au sein d'une activité uniquement, c'est-à-dire qu'il doit être limité à l'activité afin qu'il ne dure pas plus longtemps que l'activité. Étant donné que son activité est étendue, nous aurons probablement `RecycledViewPool` dans Activity, nous pouvons également l'avoir dans `ViewModel` mais ce n'est pas une bonne idée de le mettre dans `ViewModel`.

2.Les ViewHolders partagés doivent avoir le même ViewType alors seulement il peut être récupéré dans RecycledViewPool.

3. Chaque RecyclerView.LayoutManager qui partage le pool doit avoir l'indicateur recycleChildrenOnDetach défini sur true afin que les vues soient immédiatement disponibles pour les autres RecyclerViews. L'indicateur `recycleChildrenOnDetach` est disponible dans les LayoutManagers officiels comme LinearLayoutManager et GridLayoutManager.

LinearLayoutManager#setRecycleChildrenOnDetach
Définissez si LayoutManager recyclera ses enfants lorsqu'il sera détaché de RecyclerView.

4. Définition de la taille du pool – La limite par défaut des viewHolders qui pourraient être détenus par un pool par rapport à un type de vue est 5. Si vous souhaitez le modifier, vous pouvez le faire en appelant
`setMaxRecycledViews`. Vous devez modifier la limite en fonction du nombre d'apparitions du type de vue à l'écran. est plus rare et n'apparaît à l'écran qu'une fois que vous avez pu définir la taille du pool sur 1 pour économiser de la mémoire.

Pour notre exemple de partage d'un pool de vues, nous créons une instance de `RecyclerView.RecycledViewPool` dans Activity.

 class HomeActivity : AppCompatActivity() {
   var sharedRecycledViewPool : RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()
     remplacer fun onCreate(savedInstanceState : Bundle ?) {
       super.onCreate(savedInstanceState)
      }
 }

Maintenant, nous pouvons partager cette instance View Pool entre plusieurs RecyclerView dans des fragments enfants ou dans cette activité également.

class ProductFragment : Fragment() {
   liaison var privée : FragmentFirstBinding ? = nul
   remplacer le plaisir onViewCreated (vue : vue, état de l'instance enregistré : Bundle ?) {
   super.onViewCreated (vue, enregistréInstanceState)
   liaison!!.recyclerView.setRecycledViewPool( (requireActivity() comme HomeActivity).sharedRecycledViewPool)
   val layoutManager = LinearLayoutManager(requireContext())
   layoutManager.recycleChildrenOnDetach = vrai
   liaison!!.recyclerView.layoutManager = layoutManager
   }
}

C'est tout ce que nous avons à faire . Gardez cela à l'esprit que les ViewHolders partagés doivent avoir le même type de vue,
c'est parce que ViewHolder est choisi dans le RecycledViewPool en fonction du type de vue renvoyé par #getItemViewType() .

Ceci est très utile lorsque nous avons plusieurs fragments dans l'activité affichant la liste des mêmes types de vues ou plusieurs vues de recycleur dans le même fragment/activité . Une fois que vous avez défini le pool de vues partagé, vous découvrirez que le nombre d'inflations de mise en page à partir de « #onCreateViewHolder » a diminué de près de 40 %. PARTAGEZ-LE




Source link