web-dev-qa-db-fra.com

Comment empêcher un élément RecyclerView de clignoter après notifyItemChanged (pos)?

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?

9
portfoliobuilder

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 )

24
Nick Cardoso

Vous pouvez désactiver les animations d'éléments.

mRecyclerView.setItemAnimator(null);
13
Buddy

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 .

1
Marian Paździoch

J'ai lu la solution ci-dessous et mis en œuvre et cela fonctionne bien sur chaque appareil que j'ai testé.

  • Cloner la classe d'animateur par défaut.
  • 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.

0
karan vs