notifyDataSetChanged不使用片段

时间:2016-06-09 11:56:42

标签: java android android-fragments adapter notifydatasetchanged

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

  1. 片段1 onResume()要求新数据
  2. 数据已加载并添加到数据存储
  3. 广播发送消息REST_UPDATE_ITEMS
  4. 片段1捕获该消息并更新适配器中的项目
  5. 发生了什么:我打开片段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 个答案:

答案 0 :(得分:0)

好吧,这很奇怪,但我找到了解决方案 在我的布局中,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;
}

现在它正在工作,我仍然不明白,有人可以解释发生了什么吗?