J'ai actuellement une vue recycleur dont les données sont mises à jour toutes les 5 secondes. Pour mettre à jour les données de la liste, j'utilise
notifyItemChanged(position);
notifyItemRangeChanged(position, mList.size());
Chaque fois que j'appelle notifyItemChanged (), les éléments de ma vue Recycler sont mis à jour correctement. Toutefois, il clignote car cela provoque l'appel de onBindViewHolder. Donc, c'est comme si c'était une charge fraîche à chaque fois. Comment puis-je empêcher cela, si possible?
RecyclerView a des animations intégrées qui ajoutent généralement un bel effet poli. dans votre cas, vous voudrez les désactiver:
((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
(L'animateur de vue recycleur par défaut devrait déjà être une instance de SimpleItemAnimator )
Vous pouvez désactiver les animations d'éléments.
mRecyclerView.setItemAnimator(null);
Le problème ne provient peut-être pas de l'animation mais de pas de l'identifiant stable de l'élément de la liste .
Pour utiliser des identifiants stables, vous devez:
- setHasStableIds (true)
Dans RecyclerView.Adapter, nous devons définir setHasStableIds (true); true signifie que cet adaptateur publierait une valeur unique en tant que clé pour l'élément dans le jeu de données. L'adaptateur peut utiliser la clé pour indiquer qu'il s'agit du même ou non après avoir notifié des données modifiées.
- écrasement de getItemId (int position)
Ensuite, nous devons outrepasser getItemId (int position), pour renvoyer identifié long pour l'élément à la position. Nous devons nous assurer qu'il n'y a pas de données d'articles différentes avec le même identifiant retourné.
La source de solution pour cela est ici .
J'ai lu la solution ci-dessous et mis en œuvre et cela fonctionne bien sur chaque appareil que j'ai testé.
Dans la méthode animateChange (), commentez sous 3 lignes,
final float prevAlpha = oldHolder.itemView.getAlpha();
.
.
oldHolder.itemView.setAlpha(prevAlpha);
.
.
newHolder.itemView.setAlpha(0);
Définissez l'animateur d'élément recyclerview sur celui de votre classe clonée.
// Remarque: je comprends comment la solution fonctionne sans changer la valeur alpha du nouveau titulaire, mais ce n'est pas ma solution. J'ai lu ceci sur stackoverflow lui-même mais, pour une raison quelconque, je ne pouvais plus le trouver. Partager cela pour aider les autres développeurs.