强制 RecyclerView 重绘其项目
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)
。
这适用于 90% 的项目。只有 90% 的商品会采用新样式,但部分商品会采用旧样式
我提到 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{}
显示空白
有没有办法重绘RecyclerView
的所有项目?
我有一些主题(在 style.xml 中),更改主题后,我需要重新绘制 RecyclerView
。
所以我想要一个方法来强制为适配器的每个项目重新调用 onCreateViewHolder
。
我试过:
- 调用
adapter.notifyDataSetChanged
但未调用onCreateViewHolder
- 调用
recyclerView.setVisibility(View.GONE)
然后recyclerView.setVisibility(View.VISIBLE)
- 致电
recyclerView.invalidate()
- 调用
recyclerView.setAdapter(null)
然后recyclerView.setAdapter(adapter)
。
这适用于 90% 的项目。只有 90% 的商品会采用新样式,但部分商品会采用旧样式
我提到 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{}