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