Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 704
Denis Covaci Avatar asked Apr 08 '16 08:04

Denis Covaci


People also ask

Is there an Addheaderview equivalent for RecyclerView?

addItemDecoration(headerDecoration); The decoration is also reusable since there is no need to modify the adapter or the RecyclerView at all.

What does notifyDataSetChanged do in RecyclerView?

notifyDataSetChanged. Notify any registered observers that the data set has changed. There are two different classes of data change events, item changes and structural changes. Item changes are when a single item has its data updated but no positional changes have occurred.

What is RecyclerView getItemCount?

getItemCount() - returns The number of items currently available in adapter. This method returns the size of the collection that contains the items we want to display.


2 Answers

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!

like image 119
Denis Covaci Avatar answered Sep 21 '22 08:09

Denis Covaci


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 } 
like image 40
kosiara - Bartosz Kosarzycki Avatar answered Sep 21 '22 08:09

kosiara - Bartosz Kosarzycki