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.notifyDataSetChangedbutonCreateViewHolderis not called - call
recyclerView.setVisibility(View.GONE)and thenrecyclerView.setVisibility(View.VISIBLE) - call
recyclerView.invalidate() - call
recyclerView.setAdapter(null)and thenrecyclerView.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();
The only solution that worked for me on an Amazon Fire HD was this:
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.getRecycledViewPool().clear();
recyclerView.swapAdapter(myAdapter, false);
recyclerView.setLayoutManager(layoutManager);
myAdapter.notifyDataSetChanged();
Hope it helps!
Take a look at this answer: https://stackoverflow.com/a/33342314/4142087
Shortly, you can create different types of view holders, changing view type will force RecyclerView to pass another ViewHolder to the onBindViewHolder.
If you use setTheme, you have to recreate whole Activity like this: https://stackoverflow.com/a/14367214/4142087
来源:https://stackoverflow.com/questions/36495009/force-recyclerview-to-redraw-its-items