【问题标题】:notifyDataSetChanged not working with fragmentsnotifyDataSetChanged 不适用于片段
【发布时间】:2016-06-09 11:56:42
【问题描述】:

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

  1. fragment 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

【问题讨论】:

  • 在调用 notifychange 之前,请确保先将新数据添加到 arraylist,然后再调用 notifychange
  • 数据已正确添加,但仍无法正常工作

标签: java android android-fragments adapter notifydatasetchanged


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多