Android 正在保存片段的实例';s列表视图
我有一个主要的活动,它包含两个片段(Frag a和Frag B)。 一次只能显示一个片段。 两个片段都包含一个ListView(Frag a和Frag B都通用) 1.创建活动时,框架A通过异步任务加载其所有值 2.当我按下一个按钮时,我切换到Frag B,该程序与Frag B相同 3.再次按下按钮,我切换到Frag a,并再次调用AsyncTask 我不想执行第三步。相反,我只想保存Frag A的实例。这样就不会再次加载内容。我该怎么做 我知道我将不得不再次停止调用AsyncTask,这将得到解决。非常感谢您在保存实例状态方面提供的任何帮助Android 正在保存片段的实例';s列表视图,android,android-fragments,android-asynctask,Android,Android Fragments,Android Asynctask,我有一个主要的活动,它包含两个片段(Frag a和Frag B)。 一次只能显示一个片段。 两个片段都包含一个ListView(Frag a和Frag B都通用) 1.创建活动时,框架A通过异步任务加载其所有值 2.当我按下一个按钮时,我切换到Frag B,该程序与Frag B相同 3.再次按下按钮,我切换到Frag a,并再次调用AsyncTask 我不想执行第三步。相反,我只想保存Frag A的实例。这样就不会再次加载内容。我该怎么做 我知道我将不得不再次停止调用AsyncTask,这将得到
public class DepositFragement extends Fragment {
ProgressDialog pDialog;
private String TAG="DEPOSITS FRAGMENT";
PrefManager pref;
ListView depList;
ListView depoList;
Boolean isFirstTime=true;
Parcelable depoListInstance;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setRetainInstance(true);
return inflater.inflate(R.layout.deposits_fragment,container,false);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("Depo Instance", depoList.onSaveInstanceState());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState!=null)
{
depoListInstance = savedInstanceState.getParcelable("Depo Instance");
depoList.onRestoreInstanceState(depoListInstance);
}
depoList=(ListView)getActivity().findViewById(R.id.lvDepositList);
if(isNetworkAvailable())
{
if(isFirstTime) {
new LoadDeposits().execute();
isFirstTime = false;
}
}
else {
AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
alertDialog.setTitle("Info");
alertDialog.setMessage("Internet not available, Cross check your internet connectivity and try again");
alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
}
}
您可以在片段上创建一个标志,如
isLoaded
,当AsyncTask返回数据时,该标志设置为true
然后,在片段的onCreate
方法中,您可以使用:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
因此,当片段暂停时,数据将被保留
在异步任务的执行后回调中,为返回的数据设置一个字段
@Override
protected void onPostExecute(List<Object> result) {
DepositFragement.this.dataResult = result;
refreshAdapter();
}
对于每个片段,可以重写onSaveInstanceState方法,并在其中保存所需的任何内容
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's state here
}
您还应该通过覆盖onActivityCreated来检索它
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
if (savedInstanceState != null) {
//Restore the fragment's state here
}
}
我必须在onPause()方法中保存实例状态吗?不,只需设置setRetainInstance,它就可以为您完成所有操作。另外,在片段的
onPause()
方法上保存实例状态可能不可靠。@重写public void onCreate(Bundle savedInstanceState){setRetainInstance(true);super.onCreate(savedInstanceState);}我这样做了,但是列表视图是空的。您没有提供任何代码,但是在片段的onResume中,您可能需要将列表视图适配器的数据设置为保存的数据字段,然后调用notifyDataSetChanged()
I am using SimpleAdapter。不支持adapter.data method@jyanksit如果人们有相关的代码要处理,他们会更容易帮助您-请向我们展示您迄今为止所做的尝试假设您正在进行片段替换,每次都可以从本地缓存加载新的片段数据。关键是您是否在任何地方缓存列表值?如果没有,你可能想缓存它,然后使用该值在FragAI上加载你的列表。我知道这一点。但我不确定如何在片段中保存listview实例以及如何保留它。你能帮我吗@Shreyyou可以保存要放入listView的元素列表,并在创建活动时重新创建其适配器。因此,在SaveInstanceState上,您将超过state.putStringArray(listArray)和onActivityCreated,您可以检索该列表并更新listView的适配器,并调用notifyDataSetChanged()
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
if (savedInstanceState != null) {
//Restore the fragment's state here
}
}