强制RecyclerView重绘Android

有没有办法重绘RecyclerView所有项目?

我有一些主题(在style.xml中),在更改主题后,我需要重绘RecyclerView

所以我想要一个强制为适配器的每个项目重新调用onCreateViewHolder的方法。

我尝试过了:

  • 调用adapter.notifyDataSetChanged但不调用onCreateViewHolder
  • 调用recyclerView.setVisibility(View.GONE) ,然后调用recyclerView.setVisibility(View.GONE) recyclerView.setVisibility(View.VISIBLE)
  • 调用recyclerView.invalidate()
  • 调用recyclerView.setAdapter(null)然后再调用recyclerView.setAdapter(null) recyclerView.setAdapter(adapter)
    这适用于90%的项目。 只有90%的商品会获得新款式,但有些商品会采用旧款式

我提到RecyclerView附加到Activity,而不是Fragment。

    我find了答案! 正确的方法是:

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

    在那之后,所有的项目都获得了新的风格!

    下面的代码行为我提供了诀窍

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

    如果要强制重绘,则需要清除View Pool of RecycleView 。 您可以使用recyclerView.getRecycledViewPool().clear();

    在亚马逊Fire HD上唯一适用于我的解决方案是:

     recyclerView.setAdapter(null); recyclerView.setLayoutManager(null); recyclerView.getRecycledViewPool().clear(); recyclerView.swapAdapter(myAdapter, false); recyclerView.setLayoutManager(layoutManager); myAdapter.notifyDataSetChanged(); 

    希望能帮助到你!

    简单地设置recyclerview的适配器再次为我工作(我希望RecyclerView重新绘制所有项目的布局)

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

    看一下这个答案: https : //stackoverflow.com/a/33342314/4142087

    不久,您可以创建不同types的视图持有者,更改视图types将强制RecyclerView将另一个ViewHolder传递给onBindViewHolder

    如果你使用setTheme ,你必须像这样重建整个Activity: https : //stackoverflow.com/a/14367214/4142087