如何在Android中保存和恢复ListView位置

时间:2011-08-23 21:00:45

标签: android listview tabview

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

先谢谢。


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

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

任何人都可以举例说明如何实现这一目标。 1.单个ListActivity在多个选项卡中使用。 2.在影响其他选项卡后,将光标位置保留在选项卡中。

您提供的解决方案表示赞赏。 提前谢谢。

4 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:10)

要获取ListView的当前位置,您可以调用

int position = mCatchList.getFirstVisiblePosition();

然后,当您导航回使用该ListView的选项卡时,您可以调用

mCatchList.setSelection(position);

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

答案 2 :(得分:1)

覆盖onSaveInstanceState以保存位置,并将位置设置回onRestoreInstanceState。 Bundle有点像HashMap,(伪代码):

onSaveInstanceState

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

然后在onRestoreInstanceState

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

答案 3 :(得分:0)

listView.setOnItemClickListener中,使用saveLastPosition方法。在listview.setAdapter(adapter);之后,调用getLastPosition方法

public void saveLastPosition(){
    int position=listView.getLastVisiblePosition();

    SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);    
    SharedPreferences.Editor editor=pref.edit();
    editor.putInt("lastPosition",position);   
    editor.apply();
}

public void getLastPosition(){
    int position=listView.getLastVisiblePosition();

    SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);      
    int lastPosition=pref.getInt("lastPosition",position);
    listView.setSelection(lastPosition);
}