web-dev-qa-db-fra.com

Forcer RecyclerView à redessiner ses articles

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:

  • appeler adapter.notifyDataSetChanged mais onCreateViewHolder n'est pas appelé
  • appeler recyclerView.setVisibility(View.GONE) puis recyclerView.setVisibility(View.VISIBLE)
  • appeler recyclerView.invalidate()
  • appelez recyclerView.setAdapter(null) puis recyclerView.setAdapter(adapter).
    Cela fonctionne bien pour 90% des articles. Seuls 90% des articles auront le nouveau style, mais certains articles auront l'ancien style

Je mentionne que le RecyclerView est attaché à une activité, pas à un fragment.

32
Denis Covaci

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!

22
Denis Covaci

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();

8
Oleg Kovalyk

Les lignes de code ci-dessous ont fait l'affaire pour moi

recyclerview.swapAdapter(myAdapter,false);
recyclerview.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
6
Edijae Crusar

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!

2

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

1
Anton Shkurenko