notifyDataSetChanged 不适用于片段

notifyDataSetChanged not working with fragments

我有一个数据存储两个片段和适配器,主要思想是:

  1. 片段 1 onResume() 请求新数据
  2. 数据已加载并添加到数据存储
  3. 广播发送消息REST_UPDATE_ITEMS
  4. 片段 1 捕获该消息并更新适配器中的项目

发生了什么:我打开片段 1 - 没问题,新数据已上传,新适配器已创建并添加到 RecyclerView,我在列表

中看到项目

当我转到片段 2 然后返回片段 1 时 - 新数据已上传且片段 1 捕获新消息,但列表为空

so: 这是捕获消息的方法

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);
}

activity 开始时创建的片段,然后

getFragmentManager().beginTransaction().add(R.id.frame_layout,fragment2).commit();

打开片段 2 和

getFragmentManager().beginTransaction().replace(R.id.frame_layout, fragment1).commit();

返回片段 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;
}

现在可以用了,我还是不明白,有人能解释一下发生了什么吗?