Je veux que RecyclerView ne recycle pas certains éléments
Je suis en utilisant un RecyclerView
à une hétérogénéité des points de vue à l'intérieur, comme on le voit dans ce tutoriel.
J'ai quelques éléments à l'intérieur que RecyclerView qui sont RecyclerViews trop. Trop dur à imaginer? Disons que je veux copier le Play Store de la mise en page: Un grand RecyclerView vertical linéaire de la mise en page et rempli par de nombreux éléments: Unique apps et le carrousel des apps.
Si l'élément à ajouter est la mise en page pour une seule application, l'ID 1 sera utilisé et je vais ajouter la mise en page d'un article unique.
Sinon, si j'ai besoin d'ajouter un Carrousel ensuite, je voudrais ajouter un élément à la principale RecyclerView: un Autre RecyclerView avec sa propre carte.
Qui fonctionne très bien. Sauf lorsque vous faites défiler la principale RecyclerView. Pourquoi? Parce que certains points de vue sont détruits lorsqu'ils ne sont plus visibles, puis recréé dans le onBindViewHolder()
méthode. Pourquoi ici? Étant donné que la Carte des principaux RecyclerView est en train de passer de la position en X et en appelle ensuite OnBindViewHolder()
. Ce dernier crée alors un nouveau RecyclerView avec sa propre carte et l'attribue à elle. J'aimerais garder ces points de vue, tout simplement parce qu'ils sont lourds à regonfler à chaque fois.
Est-ce possible? Si oui, pouvez-vous me dire comment?
source d'informationauteur Joaquin Iurchuk
Vous devez vous connecter pour publier un commentaire.
Utiliser ceci:
Ce ne sera pas recycler tout point de vue de viewType
TYPE_CAROUSEL
mais si le nombre d'éléments de ce type est très élevé, il permettra de réduire vos performances de manière significative, peut-être même à cause OOMEsMODIFIER
Après la lecture de MML13's réponse, je pense qu'il pourrait travailler pour vous. Vous êtes inquiet au sujet de éléments de votre carrousel être reinflated lors de ce point de vue est rebinded à l'extérieur de la RecyclerView. Si tous ceux du carrousel sont de même type, c'est à dire, ils utilisent tous la même carte, vous pouvez garder l'adaptateur à l'intérieur extérieure RecyclerView de ViewHolder, et il vous suffit de changer les données et les appels
notifyDataSetChanged()
ounotifyItemRangeChanged(...)
sur cette carte quand il est rebinded. Cela permettra de recycler tous carrousel points de vue et tous les points de vue à l'intérieur de ces carrousels.Vous pouvez également définir de code ci-dessous dans votre onBindViewholder() la méthode de l'adaptateur.
J'ai pris de référence à partir de ce lien
http://aphoe.com/blog/prevent-androids-recyclerview-recycling-views/
C'est pas vrai, ils ne sont pas créés de nouveau, ils suffit de les relier. si vous l'avez vue pour la position X (au rebut ou de recyclage)
RecyclerView
va l'utiliser et de les relier.Le principal
RecyclerView
garde pour vous. Vous avez seulement besoin de changer la carte les données de votre deuxièmeRecyclerView
et appelnotifyDataSetChanged
. Également stocker votre deuxièmeRecyclerView
de l'adaptateur à l'intérieur de laviewHolder
de votre principalRecyclerView
.Vous pouvez ajouter dans votre carte:
Informe le recycleur de savoir si cet élément peut être recyclé. Des points de vue qui ne sont pas recyclables ne sera pas réutilisée pour d'autres éléments jusqu'à ce que
setIsRecyclable()
est ensuite définie sur true. Les appels àsetIsRecyclable()
doit toujours être associé (un appel àsetIsRecyclabe(false)
doit toujours être mis en correspondance avec un appel ultérieur àsetIsRecyclable(true)
). Paires d'appels peuvent être imbriquées, que l'état est à l'intérieur de référence comptés.Ensemble de la ligne ci-dessous dans votre activité
recyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);
jeu de Code ci-Dessous dans RecyclerViewAdapter classe