【问题标题】:How to save and restore ListView position in Android如何在 Android 中保存和恢复 ListView 位置
【发布时间】:2011-11-02 07:23:12
【问题描述】:

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

提前致谢。


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

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

谁能给我一个如何实现这一目标的例子。 1.单个ListActivity在多个标签中使用。 2. 保留标签中的光标位置,不影响其他标签。

感谢您提供的解决方案。 提前致谢。

【问题讨论】:

  • 听起来您正在创建一个新的 ListView 或者每次切换到选项卡时都会以某种方式更新内容。你能把你的代码贴出来吗?
  • 请看下面的帖子,可能对你有帮助:stackoverflow.com/questions/3014089/…

标签: android listview tabview


【解决方案1】:

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);
}

【讨论】:

  • 在回答中添加描述和解释有助于作者和其他用户了解您所做的事情或您的回答为何有用...
【解决方案2】:

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

onSaveInstanceState:

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

然后在onRestoreInstanceState:

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

【讨论】:

    【解决方案3】:

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

    int position = mCatchList.getFirstVisiblePosition();
    

    然后,一旦您导航回具有该 ListView 的选项卡,您就可以调用

    mCatchList.setSelection(position);
    

    这将取决于您的代码是如何编写来判断是否需要将位置添加到 savedInstanceState 中的,或者无论如何。

    【讨论】:

    • 是否有可能获得浮动位置?当我这样做时,它会跳到视图位置的顶部
    • 我相信这可以通过获得最顶部的视图并找出屏幕上显示的数量来实现。我没有这方面的例子,但我很确定快速搜索会带来一些东西
    • 我发现可以保存它的preasble对象,并恢复它。
    • @KirillKulakov 你所说的“preasble”对象是什么意思?请解释一下,因为我有类似的问题。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2021-08-20
      • 2018-01-30
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      相关资源
      最近更新 更多