我一直在从服务器加载数据并将其呈现在列表视图或网格视图中,但每次暂停活动或将其最小化时,数据都会在我返回上述活动时重新加载。
我知道可以在onSaveInstanceState中保存字符串,整数或布尔值但是有一种方法可以保存其他数据对象,例如对象的ArrayLists,记住一些片段嵌套在其他片段中,这使得使用setRetainInstance(true)不可行?
答案 0 :(得分:2)
这是一个官方android指南的链接来处理这个问题 http://developer.android.com/guide/topics/resources/runtime-changes.html
基本上你在片段中保存数据(对象的ArrayList),当恢复Activity时,你从片段中检索数据。
片段在活动更改状态之间或运行时更改期间不会被销毁。
这就是你的片段应该是这样的:
public class RetainedFragment extends Fragment {
// data object we want to retain
private ArrayList<YourObject> data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(ArrayList<YourObject> data) {
this.data = data;
}
public ArrayList<YourObject> getData() {
return data;
}
}
你的onDestroy()方法:
@Override
public void onDestroy() {
super.onDestroy();
// store the data in the fragment
dataFragment.setData(collectMyLoadedData());
}
你的onCreate()方法应该是相同的唯一区别是你在这一行上加载数据的方式:
dataFragment.setData(loadMyData());
对于嵌套片段问题,请检查此链接http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en
答案 1 :(得分:2)
简短的回答是肯定的,只要您确保它实现Parcelable或Serializable,您就可以将任何内容保存到onSaveInstanceState中。
对于您的情况,更长但可能更好的解决方案是使用LoaderManager回调来从互联网加载您的内容。这将您的数据与活动生命周期分离,使您免于运行时更改所带来的许多痛苦。
答案 2 :(得分:0)
如果要在片段中保存数据,请在片段中调用方法setRetainInstance( )
,这样在运行时更改期间不会销毁片段,
您可以通过在活动的onSaveInstanceState
回调方法中对其进行分区并写入包来保存自定义对象,并在onCreate
或OnRestart
回调中检索它。
我希望blog post可以帮助您详细了解事情