【问题标题】:Saving Instance of Fragment's ListViewFragment的ListView的保存实例
【发布时间】:2015-10-07 17:13:20
【问题描述】:

我有一个包含两个片段(片段 A 和片段 B)的主活动。 一次只能显示一个片段。 两个 Fragment 都包含一个 ListView(Frag A 和 Frag B 通用)。

1.创建Activity时Frag A通过AsyncTask加载其所有值

2.当我按下按钮时,我会切换到执行相同过程的 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();
    }

}





}

【问题讨论】:

  • 如果人们有一些相关的代码要处理,他们会更容易帮助您 - 请向我们展示您到目前为止所做的尝试
  • 假设您正在进行片段替换,每次都可以从本地缓存中加载片段数据。关键是您是否在任何地方缓存列表值?如果没有,您可能需要考虑缓存它,然后使用该值在 FragA 上加载您的列表

标签: android android-fragments android-asynctask


【解决方案1】:

您可以在片段上创建一个标志 - 例如 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();
}

在 onResume 中:

@Override
public void onResume() {
    super.onResume();

    if(this.dataResult != null) {
        refreshAdapter();
    }
}

void refreshAdapter() {
    adapter.data = dataResult;
    adapter.notifyDataSetChanged();
}

【讨论】:

  • 我必须在 onPause() 方法中保存实例状态吗?
  • 不,只需设置 setRetainInstance,它就会为您做所有事情。另外,在片段的onPause() 方法上保存实例状态可能不可靠。
  • @Override public void onCreate(Bundle savedInstanceState) { setRetainInstance(true); super.onCreate(savedInstanceState);我这样做了,但列表视图是空的
  • 你没有提供任何代码,但是在fragment的onResume中,你可能只需要将list view adapter的数据设置为已保存的数据字段,然后调用notifyDataSetChanged()
  • 我正在使用 SimpleAdapter。不支持adapter.data方法@jyanks
【解决方案2】:

对于每个片段,您可以覆盖 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
    }
}

【讨论】:

  • 我知道这一点。但我不确定如何在片段中保存列表视图的实例以及如何保留它。你能帮我吗? @Shrey
  • 您可以保存要放入 listView 的元素列表,并在创建活动时重新创建其适配器。所以 onSaveInstanceState 你会 outState.putStringArray(listArray) 和 onActivityCreated 你可以检索该列表并更新列表视图的适配器并调用 notifyDataSetChanged()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多