Android 正在保存片段的实例';s列表视图

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,这将得到

我有一个主要的活动,它包含两个片段(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
    }
}