web-dev-qa-db-ja.com

RecyclerViewにそのアイテムを再描画させる

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は、フラグメントではなく、アクティビティに添付されることに言及します。

32
Denis Covaci

答えが見つかりました!これを行う正しい方法は次のとおりです。

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

その後、すべてのアイテムが新しいスタイルになります!

22
Denis Covaci

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のビュープールをクリアする必要があります。 recyclerView.getRecycledViewPool().clear();を使用できます

8
Oleg Kovalyk

以下のコード行は私のためにトリックをしました

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

Amazon Fire HDで私のために働いた唯一のソリューションはこれでした:

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

それが役に立てば幸い!

2

この答えを見てください: https://stackoverflow.com/a/33342314/4142087

まもなく、異なるタイプのビューホルダーを作成できます。ビュータイプを変更すると、RecyclerViewは別のViewHolderonBindViewHolderに強制的に渡します。

setThemeを使用する場合、次のようにアクティビティ全体を再作成する必要があります。 https://stackoverflow.com/a/14367214/4142087

1
Anton Shkurenko