强制 RecyclerView 重绘其项目

Force RecyclerView to redraw its items

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

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

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

我试过:

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

看看这个答案:

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

如果您使用 setTheme,您必须像这样重新创建整个 Activity:

我找到答案了! 正确的做法是:

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

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

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

下面几行代码对我有用

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

在 Amazon 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() - i.e. redraw all all items' layouts
 */
private fun resetAdapterState() {
    val myAdapter = recyclerView.adapter
    recyclerView.adapter = myAdapter
}

我知道这已经过时了,但在 notifyDataSetChanged() 之后我遇到了需要更改视图类型的情况。如果适配器已经有数据,则由于 recycleviewadapter 的 "recycle" 部分而未调用 onCreateViewHolder,因此在 onBindViewHolder 中抛出类型转换错误。

我能够通过在适配器上调用 notifyDataSetChanged(); 之前调用 myRecyclerView.getLayoutManager().removeAllViews(); 来解决这个问题。

重置适配器对我有用,我在里面调用了这个 onConfigChange

myRecyclerView.setAdapter(myAdapter)

强制 RecyclerView onCreateViewHolder 或重绘其项目 #Kotlin

这对我有用

        this.runOnUiThread {
            val adapter = recyclerView.adapter
            val layoutManager = recyclerView.layoutManager
            recyclerView.adapter = null
            recyclerView.layoutManager = null
            recyclerView.adapter = adapter
            recyclerView.layoutManager = layoutManager
            adapter!!.notifyDataSetChanged()
        }

希望对您有所帮助

在尝试了这里的大部分想法之后 - 如果结果证明我的问题归结为使用模拟器。在设备上测试时,我对此没有任何问题。

这对我有用:

recyclerView.adapter = recyclerView.adapter
recyclerView.post {
    recyclerView.adapter?.notifyDataSetChanged()
}

如果运行没有post{}

显示空白