Заставить RecyclerView перерисовать свои элементы

Есть ли способ перерисовать все элементы RecyclerView?

У меня есть несколько тем (в стиле.xml), и после изменения темы мне нужно перерисовать RecyclerView.

Поэтому мне нужен метод, который заставит повторно вызвать onCreateViewHolder для каждого элемента адаптера.

Я попытался:

  • call adapter.notifyDataSetChanged но onCreateViewHolder не вызывается
  • вызовите recyclerView.setVisibility(View.GONE) а затем recyclerView.setVisibility(View.VISIBLE)
  • вызов recyclerView.invalidate()
  • вызовите recyclerView.setAdapter(null) а затем recyclerView.setAdapter(adapter).
    Это хорошо работает для 90% предметов. Только 90% предметов получат новый стиль, но некоторые предметы будут иметь старый стиль

Я упоминаю, что RecyclerView привязан к Activity, а не к фрагменту.

Ответы

Ответ 1

Я нашел ответ! Правильный способ сделать это:

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

После этого все предметы приобретают новый стиль!

Ответ 2

Если вы хотите принудительно перерисовать, вам нужно очистить View Pool RecycleView. Вы можете использовать recyclerView.getRecycledViewPool().clear();

Ответ 3

Просто настройка адаптера 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
}

Ответ 4

Нижеследующие строки кода сделали трюк для меня

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

Ответ 5

Взгляните на этот ответ: fooobar.com/questions/1613161/...

В скором времени вы можете создавать разные типы держателей, изменение типа просмотра заставит RecyclerView передать другой ViewHolder в onBindViewHolder.

Если вы используете setTheme, вам нужно воссоздать всю активность, например: fooobar.com/questions/50239/...

Ответ 6

Единственное решение, которое работало для меня на Amazon Fire HD, было следующим:

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

Надеюсь, поможет!