RecyclerView de clignoter après notifyDatasetChanged()
J'ai un RecyclerView qui permet de charger des données à partir de l'API, comprend une url d'image et de certaines données, et j'utilise networkImageView paresseux pour charger l'image.
@Override
public void onResponse(List<Item> response) {
mItems.clear();
for (Item item : response) {
mItems.add(item);
}
mAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
Ici est la mise en œuvre de la Carte:
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
if (isHeader(position)) {
return;
}
//- get element from your dataset at this position
//- replace the contents of the view with that element
MyViewHolder holder = (MyViewHolder) viewHolder;
final Item item = mItems.get(position - 1); //Subtract 1 for header
holder.title.setText(item.getTitle());
holder.image.setImageUrl(item.getImg_url(), VolleyClient.getInstance(mCtx).getImageLoader());
holder.image.setErrorImageResId(android.R.drawable.ic_dialog_alert);
holder.origin.setText(item.getOrigin());
}
Problème, c'est quand nous avons l'actualisation dans l'recyclerView, il est blincking pour une très courte tandis que dans le début qui semble étrange.
J'ai simplement utilisé GridView/ListView au lieu et cela a fonctionné comme je l'espérais. Il n'y avait pas blincking.
de configuration pour RecycleView dans onViewCreated of my Fragment
:
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
//use this setting to improve performance if you know that changes
//in content do not change the layout size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
mGridLayoutManager = (GridLayoutManager) mRecyclerView.getLayoutManager();
mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return mAdapter.isHeader(position) ? mGridLayoutManager.getSpanCount() : 1;
}
});
mRecyclerView.setAdapter(mAdapter);
Personne face à un tel problème? quelle pourrait être la raison?
- Double Possible de Désactiver onChange animations sur ItemAnimator pour RecyclerView
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser stable Id dans votre RecyclerView.Adaptateur
setHasStableIds(true)
et remplacergetItemId(int position)
.Sans stables Id, après
notifyDataSetChanged()
, ViewHolders généralement attribué à pas pour les mêmes positions. C'était la raison de clignotant dans mon cas.Vous pouvez trouver un bonne explication ici.
Selon cette question page ....c'est le défaut recycleview de modification d'élément d'animation... Vous pouvez la désactiver.. essayez cette
Changement dans la dernière version
Cité de Développeur Android blog:
Ce simplement travaillé:
code
ItemAnimator animateur = recyclerView.getItemAnimator(); if (animateur instanceof SimpleItemAnimator) { ((SimpleItemAnimator) animateur).setSupportsChangeAnimations(false); }code
essayez ceci pour désactiver l'animation par défaut
ce la nouvelle façon de désactiver l'animation depuis le soutien android 23
cette ancienne méthode de travail pour l'ancienne version de la bibliothèque de prise en charge
J'ai le même problème de chargement d'image à partir de certaines adresses url et puis imageView clignote.
Résolu en utilisant
au lieu de
qui évite de recharger ces inchangé vieux données.
En supposant
mItems
est la collection qui sauvegarde votreAdapter
, pourquoi êtes-vous de retirer tout et de le rajouter? Vous êtes lui disant que tout a changé, de sorte RecyclerView relie tous les points de vue que je suppose que l'Image de la bibliothèque ne le gère pas correctement où il rétablit la Vue, même si c'est la même url de l'image. Peut-être qu'ils avaient de la galette dans la solution pour AdapterView de sorte qu'il fonctionne bien dans GridView.Au lieu de l'appeler
notifyDataSetChanged
qui va entraîner une nouvelle liaison de tous les points de vue, l'appel granulaire informer des événements (avertir ajouté/supprimé/déplacé/jour), de sorte que RecyclerView permettra de relier seulement nécessaire de vues et rien ne se met à clignoter.Recyclerview utilise DefaultItemAnimator en tant que par défaut c'est l'animateur.
Comme vous pouvez le voir dans le code ci-dessous, ils changent l'alpha de la vue titulaire lors de la modification d'élément:
Je voulais conserver le reste des animations, mais supprimer le "scintillement" j'ai donc cloné DefaultItemAnimator et supprimé de l'alpha 3 lignes ci-dessus.
À utiliser le nouvel animateur appelez simplement setItemAnimator() sur votre RecyclerView:
Hey @Ali, il pourrait être la fin de la relecture. J'ai aussi été confronté à ce problème et l'a résolu avec ci-dessous la solution, il peut aider à vous s'il vous plaît vérifier.
LruBitmapCache.java classe est créé pour obtenir l'image la taille du cache
VolleyClient.java classe singleton [étend le champ d'Application] ajout du code ci-dessous
dans VolleyClient singleton constructeur de la classe de ajouter de l'extrait de code ci-dessous pour initialiser le ImageLoader
J'ai créé getLruBitmapCache() méthode pour retourner LruBitmapCache
Espère que sa va vous aider.
Essayez d'utiliser la stableId en recycleur de vue. L'article suivant explique brièvement il
https://medium.com/@hanru.yeh/recyclerviews-views-are-blinking-when-notifydatasetchanged-c7b76d5149a2
J'ai eu le même problème et cela a fonctionné pour moi
Vous pouvez appeler cette méthode pour définir la taille de l'image cache
pour mon application, j'ai eu quelques données de changer mais je ne voulais pas la totalité de la vue à clignoter.
Je l'ai résolu en seulement la décoloration de la oldview en baisse de 0,5 alpha et le démarrage de l'newview alpha à 0.5. Cela a créé un doux décoloration de transition sans apporter le point de vue de disparaître complètement.
Malheureusement à cause de privé implémentations, je ne pouvais pas sous-classe de la DefaultItemAnimator afin de faire ce changement, donc j'ai eu à faire un clone du code et de faire les modifications suivantes
dans animateChange:
dans animateChangeImpl:
pour moi
recyclerView.setHasFixedSize(true);
travailléL'aide appropriée recyclerview méthodes pour mettre à jour des points de vue de résoudre ce problème
D'abord, de faire des changements dans la liste
Puis en informer en utilisant
Espère que cela va aider!!
Dans Kotlin vous pouvez utiliser 'extension de classe" pour RecyclerView: