2011-08-23 91 views
6

我有tabView,在每个选项卡中显示列表。当我在一个标签中滚动时,切换到另一个标签并返回到上一个标签,位置返回到顶部,而不是显示以前的滚动位置。我如何实现这一目标?需要知道如何使用onSaveInstanceState & onRestoreInstanceState保存位置并使用保存的位置显示上一个滚动位置。如何在Android中保存和恢复ListView位置

在此先感谢。


谢谢大家的回复。我尝试了所有的解决方案,但遇到了其他问题。 基本上我面临的问题如下。

我有一个listview作为我的第一个活动,当我启动我的应用程序。 当我点击列表项时,它将启动包含3个选项卡的选项卡活动。 所有3个选项卡使用与ListActivity相同的活动。但3个选项卡包含不同的数据。 我的问题是如何在标签之间切换时保留列表的位置。通过提供上述解决方案,当我在一个选项卡中更改位置时,它也会影响其余选项卡。例如,如果我在第一个选项卡中的位置6,此位置将设置为第二个和第三个选项卡,以及我为所有3个选项卡使用相同的ListActivity。我不能分享代码。所以不得不长时间输入问题。此外,创建的标签数量也是动态的。它可能是3或4或5.但所有选项卡使用1个ListActivity。

任何人都可以给我一个例子如何实现这一点。 1.单个ListActivity在多个选项卡中使用。 2.在不影响其他选项卡的情况下保留选项卡中的光标位置。

您提供的解决方案值得赞赏。 在此先感谢。

+0

这听起来像你正在创建一个新的ListView或不知何故,每次切换到标签时都会更新内容。你可以发布你的代码吗? –

+0

请看下面的文章,这可以帮助你: http://stackoverflow.com/questions/3014089/maintain-save-restore-scroll-position-when-returning-to-a-listview – Xebozone

回答

12

不要在列表视图上再次调用setAdapter()。做这样的事情。

if(myListView.getAdapter() == null) 
    myListView.setAdapter(new myAdapter(this, R.layout.row, items)); 

如果您需要在适配器上更新您的ListView调用notifyDataSetChanged()。

10

为了让您的ListView的当前位置,你可以调用

int position = mCatchList.getFirstVisiblePosition(); 

然后,一旦你导航回到与ListView的标签,你可以调用

mCatchList.setSelection(position); 

这将取决于如何您的代码被写入以告知位置是否需要添加到savedInstanceState,或者是。

+0

是它可能获得浮动位置?当我这样做时,它跳到视图位置的顶部 –

+0

我相信这是可能的,通过获得最高的视图,并找出多少显示在屏幕上。我没有这方面的例子,但我敢肯定,快速搜索会带来一些东西 – hooked82

+0

我发现可以保存它的可预见的对象,并恢复它。 –

1

覆盖onSaveInstanceState保存位置,并将位置设回onRestoreInstanceState。该包是有点像一个HashMap,(伪代码):

onSaveInstanceState

bundle.putInt("MyTabsPosition", getPosition()); 

然后在onRestoreInstanceState

pseudo.setPosition(bundle.getInt("MyTabsPosition"));