notifyDataSetChanged 不适用于片段
notifyDataSetChanged not working with fragments
我有一个数据存储两个片段和适配器,主要思想是:
- 片段 1
onResume()
请求新数据
- 数据已加载并添加到数据存储
- 广播发送消息
REST_UPDATE_ITEMS
- 片段 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;
}
现在可以用了,我还是不明白,有人能解释一下发生了什么吗?
我有一个数据存储两个片段和适配器,主要思想是:
- 片段 1
onResume()
请求新数据 - 数据已加载并添加到数据存储
- 广播发送消息
REST_UPDATE_ITEMS
- 片段 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;
}
现在可以用了,我还是不明白,有人能解释一下发生了什么吗?