弹出片段堆栈时保持ListView滚动位置和数据

时间:2014-04-29 12:31:19

标签: android listview android-fragments

这是我的情况,我有1 Activity和2 Fragments。启动Activity后,它会将Fragment,我们称之为列表加载到视图中(在填充屏幕的FrameLayout中)。 列表只列出通过异步HTTP调用转发到web api的博客帖子。在列表中点击博客时,会在Activity

中运行此方法
public void loadBlog(FragmentBlog.Blog theBlog) {
    blog = theBlog;
    FragmentBlogDetails d = new FragmentBlogDetails();
    Bundle bundle = new Bundle();
    bundle.putParcelable(KEY_BLOG, theBlog);
    d.setArguments(bundle);
    fragmentManager.beginTransaction().replace(R.id.container, d).addToBackStack("Detail").commit();
}

然后博客加载并显示正常。现在,一旦我按下后退键,我的列表 Fragment再次调用onCreateView,我必须再次运行异步调用来填充我的列表,这也将滚动重置为顶部。如何保持我的数据需要再次获取,并保持视图以使滚动保持原样?

这是列表Fragment

中的onCreateView方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("FragmentBlog", "onCreateView");
    View view = inflater.inflate(R.layout.fragment_blog, container, false);
    list = (ListView) view.findViewById(R.id.the_list);
    list.setOnItemClickListener(this);
    if (baa != null) {
        list.setAdapter(baa);
    }
    text = (TextView) view.findViewById(R.id.my_text_view);
    pb = (ProgressBar) view.findViewById(R.id.progressBar);
    asyncForBlogs();
    return view;
}

如果您需要任何其他代码,请告诉我,我会发布它们。

1 个答案:

答案 0 :(得分:1)

您需要保存用户点击的最后一项的索引。在片段中定义索引变量,以及用户在其中单击项目存储项索引时。然后在onSaveInstanceState中保存数据回调。您可以保存此类其他数据。但要确保你在捆绑包中的数据不是那么大。不要在这里放任何图像或视频!

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt("index",index);
    super.onSaveInstanceState(outState);
}

保存数据后,您可以在onCreate方法中访问它。像这样

public void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        index = savedInstanceState.getInt("index");
        listView.smoothScrollToPosition(index);
    }
}

smoothScrollToPosition将列表视图滚动到您去过的最后一个位置。