Заставить RecyclerView перерисовать Android

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

у меня есть некоторые темы (в стиле.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 прилагается к действию, а не к фрагменту.

6 ответов


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

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

после этого все элементы получают новый стиль!


приведенные ниже строки кода сделали трюк для меня

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

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


единственным решением, которое сработало для меня на 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
}

взгляните на этот ответ:https://stackoverflow.com/a/33342314/4142087

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

Если вы используете setTheme, вы должны воссоздать всю активность следующим образом:https://stackoverflow.com/a/14367214/4142087