RecyclerView: comment faire pour effacer le cache/recyclé point de vue?
- Je utiliser un RecyclerView pour afficher une liste d'éléments avec une mise en forme de liste. Je switch à partir d'une liste mise en page d'une grille de mise en page, montrant seulement un sous-ensemble de toutes les données lorsque dans la grille de mise en page. Ce commutateur utilise une mise en page différente XML que lors de la mise en forme de liste est présentée.
Tout cela fonctionne bien, sauf que quand je scroll, recyclés (mis en cache?) liste des affichages de la disposition de remplir la grille, mélangé avec la bonne présentation de la grille afficher les éléments. En d'autres termes, au lieu d'utiliser mon layout_grid.xml
pour chaque élément de la mise en page dans le RecyclerView, je reçois des éléments à l'aide de la layout_list.xml
mise en page, mais dans un format de grille.
Cela me dit le LayoutManager fonctionne correctement, le passage d'une liste à la grille de mise en page. Mais pas tous les articles affichage des articles sont recréés à l'aide de la grille de mise en page xml, mais plutôt recyclé liste mise en page vues sont utilisées.
J'ai essayé RecyclerView.removeAllViews()
, RecyclerView.removeAllViewInLayout()
, RecyclerView.swapAdapter()
(à force de l'adaptateur de rechargement), en vain.
Mise à jour:
Si je défilement de deux positions vers le bas dans la liste, puis passer de la liste de la grille, les deux premières positions ne passent pas par onCreateViewHolder(), mais directement à onBindViewHolder() et ne sont donc pas obligés d'utiliser la grille de mise en page xml. Au lieu de ces deux premières position des éléments sont recyclés (je pense) et les affiche dans la liste mise en page format.
OriginalL'auteur mraviator | 2015-01-14
Vous devez vous connecter pour publier un commentaire.
Ok, maintenant je comprends. Vous utilisez les mises en page? Il existe une méthode pour retourner le viewtype pour une liste/grille élément (id/position). Vous avez trop de mettre en œuvre cette méthode correctement que l'adaptateur peut recycler la bonne mise en page pour la nouvelle vue.
Vous comprenez ce que je veux dire? 🙂
Oui exactement. Sinon, le recyclerview n'a aucune chance de savoir qui viewtype à recycler
Ok, je vois ce que vous obtenez. Mais où puis-je définir le type d'affichage? Il semble à retourner la valeur 0, soit la liste ou de grille de mise en page.
Vous devez retourner le viewtype manuellement en fonction de l'indice et puis vous pouvez le lire dans la méthode create/bindViewHolder méthode
Ahh... je vois. Le travail manuel. 🙂 Je vais donner un coup de cette ce soir (faut courir pour l'instant). Merci pour le rappeler à moi. En cas de succès, je vais marquer la réponse lorsque vous avez terminé.
OriginalL'auteur Mann
Utilisation
OriginalL'auteur Oleg Kovalyk
J'ai eu le même problème. La solution proposée par Mann fonctionne bien. Une autre option consisterait à définir la RecycledViewPool de la RecyclerView à une nouvelle instance. Qui fonctionne pour moi.
Mais je pense que la substitution de la getItemViewType() est la solution de nettoyage.
OriginalL'auteur goflo
Il semble que les acceptée réponse est la bonne pour votre cas, revenir un autre viewType est probablement ce que vous avez besoin de le faire.
Si quelqu'un a besoin de trouver un moyen pour effacer le cache de la vue titulaires et fini vers le haut dans ce fil, voici ce que j'ai trouvé qui fonctionne.
Vous devez appeler
setLayoutManager(null)
etsetAdapter(null)
. Si vous voulez garder votre carte, vous pouvez faire quelque chose commeadapter = getAdapter(); setAdapter(null); setAdapter(adapter);
Dans mon cas, le réglage de la
layoutmanager(null)
etsetAdapter(null)
a travaillé pour moi dans mon cas. Cela a sauvé de moi-même tirant sur mes cheveux!OriginalL'auteur cottonBallPaws
Ils clé ici est de remplacer
getItemViewType(int position)
et de le configurer pour que je puisse vérifier quel type d'affichage (liste ou grille), je m'occupe de cette position, puis définissez l'affichage de la manipulation pour que la position dansonbindViewHolder()
. Ci-dessous,viewFormat
est tout simplement un int que j'ai réglé soit sur la liste ou de grille lorsque l'utilisateur appuie sur le bouton menu pour changer le format.Un utilisateur qui a posté des commentaires sur mon premier post m'a fait prendre conscience de cela, mais, malheureusement, ces commentaires ont été édités. Je les remercie pour me pointer dans la bonne direction.
OriginalL'auteur mraviator
Recyclerview a vue de la mise en cache ainsi que recyclé vue sur piscine (vue détenteurs de la piscine).
Cache est de views (vues avec peuplé de données). Lorsque LayoutManager dit recyclerview ce point de vue n'est plus visible et nécessaire, recyclerview vérifie si le point de vue est toujours valide pour une position particulière, si elle est valide, alors il est ajouté au cache, de sorte que quand la prochaine fois LM demande l'affichage de la position, cela revient à partir du cache comme il est.
Alors ce qui est recyclé, vue sur la piscine? Lorsque les vues sont supprimés du cache ou ne sont plus valables vues, puis les données liées à ces vues est sélectionnée et la seule vue détenteur de l'objet est conservé dans la piscine. Selon itemType, piscine pouvez avoir vue les titulaires de différents types d'élément.
Maintenant, dans votre cas, vos points de vue ne sont pas valables pour ce poste en particulier que vous voulez montrer au total de vue différents. Ainsi, votre carte devrait dire recyclerview que tous les points de vue ne sont pas valides. Seule façon de le faire est par l'utilisation de notifyDataSetChanged pour tous les éléments. Recyclerview va retirer les vues de cache et les ajouter à recyler vue sur la piscine. Alors maintenant, lorsque LM demande pour la vue, soit recyclés, vue(selon itemType) ou nouvellement créé sera retourné, et l'adaptateur qui va lier les données de ces points de vue.
OriginalL'auteur Virat18
Viens de le faire
Simple !!
OriginalL'auteur Shahjad S