Заставить 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