Android - 在Fragment replace上保存RecyclerView状态和项目而不会丢失内存

时间:2016-04-18 09:23:43

标签: android android-fragments android-recyclerview

我的应用有很多RecyclerViewFragment。每次我转到下一个Fragment,即A到B,A&#39}中的滚动位置和值都会被保存。

我将状态保存为暂停,如:

RecyclerViewAdapter

然后在onCreateView上恢复:

@Override
public void onPause() {
    super.onPause();
    getArguments().putParcelable(utilities.BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}

问题是,当我去B时,A仍然在内存中导致非常大的内存使用量,直到OOM,如果我要去A - B - A - B - A - B等。

问题是:

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

1 个答案:

答案 0 :(得分:0)

RecyclerView负责自动保存状态。你不必对国家做任何事情(在许多情况下)。看看这篇文章 - > http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

由于其他原因,您的记忆问题可能存在。片段作为类的实例,在转换后会在内存中保留(通知视图被破坏,并且当片段再次可见时再次创建)。 如果您将项目列表保存为片段的类变量,则当您从A转换为B时,它们将在内存中。

保存内存从OnCreateView方法中的数据源(网络或数据库)检索数据并销毁onDestroyView

中的所有视图(均衡为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应该保存其状态而不需要任何额外的代码。但它不适合你,你的代码很好。