notifyDataSetChanged не работает с фрагментами
У меня есть хранилище данных, два фрагмента и адаптер, основная идея:
- фрагмент 1
onResume()
запросить новые данные - данные загружаются и добавляются в хранилище данных
- трансляция отправляет сообщение
REST_UPDATE_ITEMS
- фрагмент 1 перехватывает это сообщение и обновляет элементы в адаптере
что происходит: я открываю фрагмент 1 - все в порядке, новые данные загружены, новый адаптер создан и добавлен в RecyclerView
и я вижу предметы в списке
когда я иду к фрагменту 2, а затем возвращаюсь к фрагменту 1 - новые данные загружаются, а фрагмент 1 ловит новое сообщение, но список пуст
так: это метод, который ловит сообщение
case REST_UPDATE_ITEMS: {
if (adapter == null) {
adapter = new MyAdapter(getActivity(), DataStorage.getInstance().getItems());
recyclerView.setAdapter(adapter);
} else {
adapter.swap(DataStorage.getInstance().getItems());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}
break;
}
и ничего не происходит, когда notifyDataSetChanged()
называется, просто пустой список, но если я буду каждый раз создавать только новый адаптер
case REST_UPDATE_ITEMS: {
adapter = new MyAdapter(getActivity(), DataStorage.getInstance().getItems());
recyclerView.setAdapter(adapter);
break;
}
он работает и обновляет данные каждый раз, но мигает! каждый раз, когда я вижу это раздражает мигает.
Я хочу плавную замену данных, или просто не пустой список каждый раз, когда я открываю фрагмент: старые данные -> какой-то необычный эффект -> новые данные
Но каждый раз, когда я открываю фрагмент: пусто -> мигает или даже причудливый эффект -> некоторые данные
и это метод обмена с адаптера:
public void swap(ArrayList<Items> items){
this.items.clear();
this.items.addAll(items);
}
фрагменты, созданные при начале действия, а затем просто
getFragmentManager().beginTransaction().add(R.id.frame_layout,fragment2).commit();
открыть фрагмент 2 и
getFragmentManager().beginTransaction().replace(R.id.frame_layout, fragment1).commit();
вернуться к фрагменту 1
1 ответ
Хорошо, это странно, но я нашел решение в моем макете. RecyclerView был дочерним от ScrollView - я удалил ScrollView и изменил метод обновления следующим образом:
case REST_UPDATE: {
if (adapter == null || recyclerView.getAdapter() == null) {
adapter = new adapter(getActivity(), DataStorage.getInstance().getItems());
recyclerView.setAdapter(adapter);
} else {
adapter.swap(DataStorage.getInstance().getItems());
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
break;
}
и теперь это работает, я до сих пор не понимаю, кто-то может объяснить, что происходит?