强制RecyclerView重绘Android

Den*_*aci 34 android redraw android-recyclerview

有没有办法重绘所有项目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附加到一个Activity,而不是一个Fragment.

Den*_*aci 26

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

recyclerView.setAdapter(null);
recyclerView.setLayoutManager(null);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

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

  • recyclerView.setAdapter(适配器)对我来说已经足够了. (13认同)
  • `adapter.doYourStaff(); recyclerView.setAdapter(adapter);`这两行代码就足够了! (9认同)

kos*_*cki 13

简单地设置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
}
Run Code Online (Sandbox Code Playgroud)


Azi*_*ziz 8

重置适配器对我有用,我在里面称之为onConfigChange

myRecyclerView.setAdapter(myAdapter)
Run Code Online (Sandbox Code Playgroud)


小智 7

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

  • 在我调用clear后,ViewHolders仍然没有重新绘制。即使我调用notifyDataSetChanged。不知何故,仍然缓存的视图持有者被重新使用。 (2认同)

小智 7

我知道这已经很旧了,但我遇到了一种情况,我需要在notifyDataSetChanged(). 如果适配器已经有数据,则onCreateViewHolder由于 recycleviewadapter 的“回收”部分而不会被调用,因此会在onBindViewHolder.

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


Edi*_*sar 6

下面的代码行为我做了诀窍

recyclerview.swapAdapter(myAdapter,false);
recyclerview.setLayoutManager(myLayoutManager);
myAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)