我有一个应用程序,其中有很多 RecyclerView
和 Fragment
。每次我转到下一个 Fragment
,即 A 到 B,A 的滚动位置和 RecyclerViewAdapter
中的值都会保存。
我将状态 onPause 保存为:
@Override
public void onPause() {
super.onPause();
getArguments().putParcelable(utilities.BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}
然后在 CreateView 上恢复它:
Parcelable savedRecyclerLayoutState = getArguments().getParcelable(utilities.BUNDLE_RECYCLER_LAYOUT);
manager.onRestoreInstanceState(savedRecyclerLayoutState);
recyclerView.setAdapter(
recyclerView.setLayoutManager(manager);
问题是,当我转到 B 时,A 仍在内存中,如果我要转到 A - B - A - B - A - B 等,这会导致内存使用量非常高,直到 OOM。
问题是:
- 我是否做错了状态保存?
- 有没有办法保存适配器内容?
- 更换灯泡需要多少程序员?
最佳答案
RecyclerView 负责自动保存状态。您不必对状态做任何事情(在许多情况下)。看看这篇文章 -> http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en
您的内存问题可能由于其他原因而存在。 fragment ,作为一个类的实例,在转换后保留在内存中(注意 View 被销毁并在 fragment 再次可见时再次创建)。 如果您将项目列表保存为 fragment 的类变量,当您从 A 转移到 B 时,它们将在内存中。
在 OnCreateView 方法中从数据源(网络或数据库)检索数据并在 onDestroyView 中销毁所有 View (等于 null)是一个节省内存的好主意
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.myfragmentlayout, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = (RecyclerView) view.findViewById(R.id.myrecycler);
recyclerView.setLayoutManager(manager);
myDataSource.retrieveData(new DataCallback(){
public void dataRetrieved(List<Item> items){
//This is working on Main Thread
recyclerView.setAdapter(new MyAdapter(items));
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
recyclerView = null;
//with this data is freed and GarbashCollector is able to recover memory when the system needs it
}
正如我所说,recyclerView 应该在没有任何额外代码的情况下保存它的状态。但它不适合你,你的代码没问题。
关于Android - 在 fragment 替换时保存 RecyclerView 状态和项目而不会丢失内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36689994/