强制RecyclerView重绘其项目

时间:2016-04-08 08:30:53

标签: android android-recyclerview redraw

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

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

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

我试图:

  • 致电adapter.notifyDataSetChangedonCreateViewHolder未被称为
  • 致电recyclerView.setVisibility(View.GONE),然后致电recyclerView.setVisibility(View.VISIBLE)
  • 致电recyclerView.invalidate()
  • 致电recyclerView.setAdapter(null),然后致电recyclerView.setAdapter(adapter) 这适用于90%的项目。只有90%的商品会获得新款式,但有些商品会采用旧款式

我提到RecyclerView附加到一个活动,而不是一个片段。

10 个答案:

答案 0 :(得分:21)

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

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

之后,所有项目都获得新风格!

答案 1 :(得分:8)

如果要强制重绘,则需要清除RecycleView的查看池。您可以使用recyclerView.getRecycledViewPool().clear();

答案 2 :(得分:8)

只需重新设置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
}

答案 3 :(得分:5)

以下代码行为我提供了诀窍

Install Package

答案 4 :(得分:4)

重置适配器为我工作,我在onConfigChange内称呼它

myRecyclerView.setAdapter(myAdapter)

答案 5 :(得分:2)

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

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

希望它有所帮助!

答案 6 :(得分:1)

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

很快,您可以创建不同类型的视图持有者,更改视图类型将强制RecyclerView将另一个private void StartTimer() { var timer = new TimerCustom(5); timer.TimeElapsed += (s, t) => ValueOfTimer = t; timer.StartAsync(() => { TakePicture(); }); } 传递给ViewHolder

如果您使用onBindViewHolder,则必须重新创建整个活动,如下所示:https://stackoverflow.com/a/14367214/4142087

答案 7 :(得分:0)

我知道这已经很老了,但是我有一种情况,我需要在notifyDataSetChanged()之后更改视图的类型。如果适配器已经有数据,则由于recycleviewadapter的“回收”部分未调用onCreateViewHolder,因此在onBindViewHolder中引发了类型转换错误。

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

答案 8 :(得分:0)

强制将RecyclerView设置为onCreateViewHolder或重画其项目#Kotlin

这对我有用?

chown -R myuser:myuser 10.160.16.3

希望这可以帮助

答案 9 :(得分:0)

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