[英]Items in Recyclerview + Listadapter won't redraw on update
[英]Force RecyclerView to redraw its items
有没有办法重绘RecyclerView
的所有项目?
我有一些主题(在 style.xml 中),更改主题后,我需要重绘RecyclerView
。
所以我想要一个方法来强制为适配器的每个项目重新调用onCreateViewHolder
。
我尝试过了:
adapter.notifyDataSetChanged
但未调用onCreateViewHolder
recyclerView.setVisibility(View.GONE)
然后recyclerView.setVisibility(View.VISIBLE)
recyclerView.invalidate()
recyclerView.setAdapter(null)
然后recyclerView.setAdapter(adapter)
。我提到RecyclerView
附加到 Activity,而不是 Fragment。
我找到了答案! 正确的方法是:
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(myLayoutManager);
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
}
如果要强制重绘,则需要清除RecycleView
的 View Pool 。 您可以使用recyclerView.getRecycledViewPool().clear();
下面的代码行对我有用
recyclerview.swapAdapter(myAdapter,false);
recyclerview.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
我知道这很旧,但是我遇到了需要在notifyDataSetChanged()
之后更改查看器类型的情况。 如果适配器已经有数据,则不会调用onCreateViewHolder
,因为 recycleviewadapter 的“回收”部分,因此会在onBindViewHolder
中引发类型转换错误。
我可以通过调用myRecyclerView.getLayoutManager().removeAllViews();
来解决这个问题。 在调用notifyDataSetChanged();
在适配器上。
重置适配器对我有用,我在onConfigChange
内部调用了这个
myRecyclerView.setAdapter(myAdapter)
在 Amazon Fire HD 上对我有用的唯一解决方案是:
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.getRecycledViewPool().clear();
recyclerView.swapAdapter(myAdapter, false);
recyclerView.setLayoutManager(layoutManager);
myAdapter.notifyDataSetChanged();
希望能帮助到你!
这对我有用:
recyclerView.adapter = recyclerView.adapter
recyclerView.post {
recyclerView.adapter?.notifyDataSetChanged()
}
如果在没有post{}
强制 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()
}
希望这可以帮助
在尝试了这里的大部分想法之后 - 如果事实证明我的问题归结为使用模拟器。 在设备上进行测试时,我对此没有任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.