Заставить 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();
Надеюсь, поможет!