这是我的情况,我有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
@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;
}
如果您需要任何其他代码,请告诉我,我会发布它们。
答案 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将列表视图滚动到您去过的最后一个位置。