notifyDataSetChanged не работает с фрагментами

У меня есть хранилище данных, два фрагмента и адаптер, основная идея:

  1. фрагмент 1 onResume() запросить новые данные
  2. данные загружаются и добавляются в хранилище данных
  3. трансляция отправляет сообщение REST_UPDATE_ITEMS
  4. фрагмент 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;
}

и теперь это работает, я до сих пор не понимаю, кто-то может объяснить, что происходит?

Другие вопросы по тегам