Java 如何保存具有listview的片段状态

Java 如何保存具有listview的片段状态,java,android,android-listview,fragment,Java,Android,Android Listview,Fragment,这是一种情况。我想从片段A->B->C导航 在B片段中有listview。单击项目,我打开详图视图C片段。 当然,在从B到C进行事务处理时,我使用了replace方法并添加了addtoBackStack(null),以便在返回时按它返回到B 一切顺利。但是当我从C返回B时,视图正在刷新,因此再次调用Web服务。我不想这样做。我想用listview保留B片段状态 我得到了一些保留实例的帖子,但没有多大帮助 非常感谢您的帮助 谢谢。如前所述,您可以使用onSaveInstanceState()将数据

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

在B片段中有listview。单击项目,我打开详图视图C片段。 当然,在从B到C进行事务处理时,我使用了replace方法并添加了addtoBackStack(null),以便在返回时按它返回到B

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

我得到了一些保留实例的帖子,但没有多大帮助

非常感谢您的帮助

谢谢。

如前所述,您可以使用onSaveInstanceState()将数据保存在捆绑包中,并使用onRestoreInstanceState()方法检索该数据

经常提到setRetInstate(true)是将ui状态保持在片段中的一种方法,但它不适用于您,因为您正在使用backbackback

因此,一个很好的方法是将scrollposition保存在onSaveInstanceState()中,然后将其还原到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);
  }

}

此外,您还可以找到一个更详细的类似示例。

您可以在oncreate中保存并定义您的ui。 在onCreateView中时,仅将其添加到布局中。 因此视图状态可以保存完美

这是我的sv:

立即创建

 LayoutInflater inflater = (LayoutInflater)
            ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.pulltorefreshgridview, null);
    mPullRefreshGridView = (PullToRefreshGridView) view
            .findViewById(R.id.listcate_pullrefresh_gridview);
strong文本 在onCreateView中

if (rootView != null) ((LinearLayout)rootView).removeAllViews();
View v = inflater.inflate(R.layout.listcate_fragment, container, false);
rootView = v;


    ((LinearLayout) v).addView(mPullRefreshGridView,
            new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.FILL_PARENT));

我认为您可以在离开片段B之前保存ListView的位置。 也许可以在片段B的顶部()中这样做。当您返回时,您可以获取该位置并将其恢复到ListView,例如在片段B的onStart()中这样做。 位置数据可能保存在活动中,因此即使拆下碎片也不会丢失


需要注意的一点是(我已经被这个问题困住了),如果后台服务更新了保存的位置数据,您应该避免在片段B的生命周期阶段onStart()之前将其恢复到ListView,因为实际上,框架将在离开片段之前保存视图的状态,并在返回时恢复它。因此,如果在框架执行此操作之前恢复您的位置,框架的恢复数据将覆盖您的位置。

我通过在onCreate()而不是onCreateView()上创建适配器解决了此问题


这是因为(我认为)添加到backbackback的片段丢失了它的视图,然后它必须重新创建视图。onCreateView()被调用并意外地重新创建您的适配器。

您是否研究过使用
捆绑包
并覆盖
onSavedInstance()
?您好@dakshbhatt21,您的问题有解决方案吗?我也有同样的问题,它困扰了我一周,没有任何突破。您好@Mungaihkamu请查看这篇文章,使用片段时,您可以找到各种类型的导航,请查看并告诉我。@alex这对我不起作用。我在搜索按钮(底部栏按钮)中找到了listview。单击下面的搜索按钮时,将重新创建我的listview。我无法保存listview的状态。帮帮我..你能发布你的xml布局并展示你的代码吗。最好是开始一个新的问题,这样做并将这个问题链接为“相似”