Existe-t-il un moyen de redessiner tous les éléments de RecyclerView
?
J'ai quelques thèmes (dans style.xml) et après avoir changé le thème, j'ai besoin que le RecyclerView
soit redessiné.
Je veux donc une méthode qui forcera à ré-appeler onCreateViewHolder
pour chaque élément de l'adaptateur.
J'ai essayé de:
adapter.notifyDataSetChanged
mais onCreateViewHolder
n'est pas appelérecyclerView.setVisibility(View.GONE)
puis recyclerView.setVisibility(View.VISIBLE)
recyclerView.invalidate()
recyclerView.setAdapter(null)
puis recyclerView.setAdapter(adapter)
.Je mentionne que le RecyclerView
est attaché à une activité, pas à un fragment.
J'ai trouvé la réponse! La bonne façon de procéder est:
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
Après cela, tous les articles obtiennent le nouveau style!
Le simple réglage à nouveau de l'adaptateur de recyclerview a fonctionné pour moi (je voulais que RecyclerView redessine la disposition de tous les éléments)
/**
* Forces RecyclerView adapter to call createViewHolder() - i.e. redraw all all items' layouts
*/
private fun resetAdapterState() {
val myAdapter = recyclerView.adapter
recyclerView.adapter = myAdapter
}
Si vous souhaitez forcer le redessin, vous devez effacer Afficher le pool de RecycleView
. Vous pouvez utiliser recyclerView.getRecycledViewPool().clear();
Les lignes de code ci-dessous ont fait l'affaire pour moi
recyclerview.swapAdapter(myAdapter,false);
recyclerview.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
La seule solution qui a fonctionné pour moi sur un Amazon Fire HD était la suivante:
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.getRecycledViewPool().clear();
recyclerView.swapAdapter(myAdapter, false);
recyclerView.setLayoutManager(layoutManager);
myAdapter.notifyDataSetChanged();
J'espère que ça aide!
Jetez un oeil à cette réponse: https://stackoverflow.com/a/33342314/4142087
En bref, vous pouvez créer différents types de supports de vue, le changement de type de vue obligera RecyclerView à passer un autre ViewHolder
au onBindViewHolder
.
Si vous utilisez setTheme
, vous devez recréer une activité entière comme ceci: https://stackoverflow.com/a/14367214/4142087