Android - 在 fragment 替换时保存 RecyclerView 状态和项目而不会丢失内存

标签 android android-fragments android-recyclerview

我有一个应用程序,其中有很多 RecyclerViewFragment。每次我转到下一个 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。

问题是:

  1. 我是否做错了状态保存?
  2. 有没有办法保存适配器内容?
  3. 更换灯泡需要多少程序员?

最佳答案

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/

相关文章:

android - Android中的单例

android - 将 ImageReader 和 SurfaceTexture 与 Android Camera2 输出同步

java - 创建一个 for 循环等待方法返回 true

java - 如何在 fragment 中正确实现谷歌地图?

java - 如何禁用recyclerview android中的复选框

android - Android 2.2 中无预览的相机捕获

android - fragment 递归进入 executePendingTransactions 错误

android - 从 fragment 的 onCreateView 调用 AsyncTask 方法失败

android - 在自定义 TextWatcher 中更新 Adapter/RecyclerView

Android CoordinatorLayout : ToolBar scroll only when list starts scrolling