如何保存具有listview的Fragment状态

sai*_*kat 12 java android fragment android-listview

这是一种情况.我想从片段A-> B-> C导航.

在B片段中有listview.单击项目时,打开详细视图C Fragment.当然我使用了替换方法并添加了addtoBackStack(null),而事务从B到C,所以在Back上按下它返回到B.

一切顺利.但是当我从C返回B时,视图正在刷新,因此再次调用web服务.我不想这样做.我想用listview保留B Fragment状态.

我得到了一些Retain Instance的帖子,但它并没有那么多帮助.

任何帮助深表感谢.

谢谢.

ale*_*lex 12

如此处所述,您可以使用onSaveInstanceState()将数据保存在Bundle中,并在onRestoreInstanceState()方法中检索该数据.

通常提到setRetainState(true)作为将ui状态保持在片段中的方式,但它不适合您,因为您正在使用backstack.

所以一个好方法可能是将onSaveInstanceState()中的scrollposition保存并在onRestoreInstanceState()中恢复它,如下所示:

public class MyListFragment extends ListFragment {

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

     int index = this.getListView().getFirstVisiblePosition();
     View v = this.getListView().getChildAt(0);
     int top = (v == null) ? 0 : v.getTop();

     outState.putInt("index", index);
     outState.putInt("top", top);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    [...]
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        index = savedInstanceState.getInt("index", -1);
        top = savedInstanceState.getInt("top", 0);
    }
    if(index!=-1){
     this.getListView().setSelectionFromTop(index, top);
  }

}
Run Code Online (Sandbox Code Playgroud)

您还可以在此处找到更详细的类似示例.