RecyclerView - obtenir tous les points de vue/viewholders
Je veux mettre à jour le RecyclerView
alors que c'est l'affichage des données, dans mon cas, je montre des images avec ou sans étiquettes.
Defaultly je définir la visibilité de l'étiquette quand j'ai créer la vue titulaire et c'est très bien, mais je veux que l'utilisateur de modifier les étiquettes de la visibilité à travers le menu lorsque le RecyclerView
est indiqué, donc je veux mettre à jour manuellement la visibilité pour tous les points de vue dans le RecyclerView
.
Puis-je obtenir en quelque sorte tous les Views
? J'ai besoin de tous, pas seulement celles que l'on voit, je ne veux pas que plus tard, recyclé View
n'est pas mis à jour...
Vous disposez de tous les paramètres de savoir si l'étiquette est visible ou pas dans le onBindViewHolder? Vous devriez vérifier ce paramètre. Mise à jour le paramètre dans le menu et jeu de carte.notifyDataSetChanged
Je suis en train de lire dans les préférences, j'ai donc envie de le faire une FOIS et toujours pas... je pouvais le faire avec un interne boolean dans l'adaptateur, ne pense pas à ce sujet en fait...
Ce paramètre est le même pour tous les articles? ou peut être différent selon l'article?
De même pour tous... C'est pourquoi je préfère une itération sur tous les points de vue...
Vous pouvez passer cette valeur dans le constructeur de l'adaptateur, et de créer une méthode dans l'adaptateur pour modifier cette valeur
Je suis en train de lire dans les préférences, j'ai donc envie de le faire une FOIS et toujours pas... je pouvais le faire avec un interne boolean dans l'adaptateur, ne pense pas à ce sujet en fait...
Ce paramètre est le même pour tous les articles? ou peut être différent selon l'article?
De même pour tous... C'est pourquoi je préfère une itération sur tous les points de vue...
Vous pouvez passer cette valeur dans le constructeur de l'adaptateur, et de créer une méthode dans l'adaptateur pour modifier cette valeur
OriginalL'auteur prom85 | 2016-01-12
Vous devez vous connecter pour publier un commentaire.
Dans l'adaptateur classe:
Dans
Activity
où vous souhaitez mettre à jour la valeur où la carte est instancié:updateVisibility
vous devez ajouternotifyDataSetChanged()
mais ensuite cela fonctionne et c'est ma solution actuelle... Encore, pour moi, il semble que ce n'est pas parfait, l'utilisateur modifie la visibilité très rarement alors qu'il défile presque toujours, de sorte que la définition de la visibilité de tous les temps n'est pas la solution la plus efficace pour moi...à l'intérieur de la classe de la Vue il y a quelques vérifie que la visibilité a été modifiée, de sorte que si vous appelez
setVisibility
avec la même valeur, il n'est pas un problème.Je ne savais pas... Alors je vais en tenir à cette solution...
Mes tests montrent que prom85 est vrai: je appeler
notifyDataSetChanged()
à la force de la RecyclerView pour redessiner les changements dans les articles qui sont déjà affichés, mais besoin d'être changé.Très reconnaissant à vous
OriginalL'auteur Chol
Vous devez d'abord obtenir tous les points de vue des indices qui sont affichés, et ensuite, vous devez aller sur chacun, et utiliser le viewHolder de chaque vue:
EDIT: il semble qu'il n'est pas toujours le retour de tous les ViewHolders vous souhaitez peut-être gérer. Cela semble être une plus grande stabilité de la solution:
Cette réponse serait plus utile si vous montré comment vous avez obtenu de référence pour le layoutManager variable.
Afin d'utiliser un RecyclerView, vous pouvez toujours créer un LayoutManager exemple, si vous avez avant. Voici une façon de créer, de travailler comme une liste verticale (mais encore une fois, vous avez besoin de choisir pour l'utiliser) : LayoutManager layoutManager=new LinearLayoutManager(ce,LinearLayoutManager.VERTICAL,false)
Ce n'est pas correct non plus, il y a certainement des titulaires de vue qui ne sont pas encore visibles: après le chargement au démarrage il y a généralement 2 ou 3 éléments liés au cours de la dernière visible.
Code fixe. Désolé pour cette.
OriginalL'auteur android developer
notifyDataSetChanged()
n'est pas commode.Je viens expérimenté regardant les journaux que j'ai mis, que RV se lie plus d'articles qui ne sont pas visibles, en effet je n'ai trouvé aucun moyen de les récupérer. J'ai fini jusqu'à cache dans un
Set
ouList
ceux ViewHolders dansonBindViewHolder()
et à uncache dansonViewRecycled()
:Mettre en œuvre votre interface ou abstrait ViewHolder de sorte que vous pouvez appeler votre méthode.
De cette façon, vous avez accès à votre ViewHolder contenu.
C'est ce que je fais dans mon FlexibleAdapter pour désélectionner les éléments sans invoquant la
notifyItemRangeChanged()
. Et si l'utilisateur a des animations, tous sont exécutés, en plus de l'arrière-plan des changements trop quand j'invoque ma méthodetoggleActivation()
.Si vous connaissez un meilleur moyen pour récupérer tous liés VH, laissez-moi savoir.
Dans ma bibliothèque, ça ne peut pas fonctionner parce que le VH n'a pas encore été créé. Mais vous pouvez essayer et voir ce qui se passe dans votre carte.
Je n'ai pas vous cette réponse avant de! Bonne solution de contournement homme!
Est-il préférable de les stocker VH, à l'aide de
WeakReference
?Je recommande l'utilisation de cette structure de données pour stocker en cache VH -
Set<AbstractViewHolder> mBoundViewHolders = Collections.newSetFromMap(new java.util.WeakHashMap<AbstractViewHolder, Boolean>());
OriginalL'auteur Davideas
La tous les points de vue sont ceux visibles, en plus de certains points de vue mis en cache par
RecyclerView
. Vous pouvez accéder à tous visiblesView
s comme ça:Même si vous y accédez en cache
View
s ils ne sont pas liés aux données, de sorte que vous ne savez pas si l'étiquette doit être visible ou non. Réglez simplement l'étiquette de la visibilité de resterViews
dansonBindViewHolder
.Le reste de la
View
s tout simplement n'existe pas encore, donc vous ne pouvez pas changer quoi que ce soit à leur sujet, même si c'est la même étiquette d'état de visibilité pour tous.Où ai-je écrit que cela vous donne accès à cache point de vue? Il n'y a aucun point dans l'accès à eux de toute façon. Modifiez simplement les visible points de vue comme je l'ai dit ci-dessus, le reste doit être modifié dans
onBindViewHolder
quandRecyclerView
a besoin d'eux.J'ai dit: "tous les sont ceux visible en plus de certains points de vue cache". Et puis: "Vous pouvez accéder à tous les visible vues comme celle-ci:" Pas un mot sur la méthode d'accès à cache point de vue. Vous avez besoin de modifier les vues visibles si vous voulez de la visibilité changement à appliquer avant l'affichage défile à l'écran et le rebond en 'onBindViewHolder'. Le problème n'est pas plus le problème. Le problème, c'est votre attitude sur le problème.
OriginalL'auteur InTwoMinds
Toutes les solutions ci-dessus ne donne que le visible titulaires, mais en réalité il y a 2-3 autres titulaires qui sont liés, mais pas visible. Pour obtenir celles-ci,
la plus simple et la pertinence de la façon que je peux penser à obtenir tous les titulaires d':
Quand vous voulez toutes les cartes visibles (plus Lié, mais pas visible):
édité pour répondre à cette exigence.
hmmm... une Autre approche serait d'dispose d'un Ensemble de ViewHolders, et cela permettra aussi d'éviter d'appeler "findViewHolderForAdapterPosition" . Peut être plus court et peut-être un tout petit peu plus efficace. Non ?
Nous voulons seulement le Courant lié VH, le seul moyen est de surveiller lorsqu'ils sont recyclés(=non relié), qui est la solution que j'ai proposé!
onViewDetachedFromWindow()
est appelée lorsque VH n'est pas visible mais il est encore lié, de sorte qu'il n'est pas assez précis.Première condition n'est pas logique. - Vous vérifier si
lastDetachedHolderPosition==-1
, et si oui, aller de 0 à elle, le sens de 0 à -1 . Cela signifie que la boucle ne fera jamais rien.OriginalL'auteur Srujan Barai