Force RecyclerView to redraw its items

Is there any way to redraw all items of RecyclerView?

I have some Themes (in style.xml) and after changing the theme, I need the RecyclerView to be redrawn.

So I want a method that will force to re-call onCreateViewHolder for each items of the adapter.

I tried to:

  • call adapter.notifyDataSetChanged but onCreateViewHolder is not called
  • call recyclerView.setVisibility(View.GONE) and then recyclerView.setVisibility(View.VISIBLE)
  • call recyclerView.invalidate()
  • call recyclerView.setAdapter(null) and then recyclerView.setAdapter(adapter).
    This works well for 90% items. Only 90% of items will get the new style, but some items will have the old style

I mention that the RecyclerView is attached to an Activity, not to a Fragment.


I found the answer! The correct way to do this is:

recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();

After that, all the items are getting the new style!


Simply setting recyclerview's adapter again worked for me (I wanted RecyclerView to redraw all items' layout again)

/**
 * Forces RecyclerView adapter to call createViewHolder() - i.e. redraw all all items' layouts
 */
private fun resetAdapterState() {
    val myAdapter = recyclerView.adapter
    recyclerView.adapter = myAdapter
}

If you want to force redraw, you need clear View Pool of RecycleView. You can use recyclerView.getRecycledViewPool().clear();


The below lines of code did the trick for me

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