【问题标题】:Android ListView scrolling to topAndroid ListView 滚动到顶部
【发布时间】:2011-02-22 19:19:12
【问题描述】:

我有一个带有自定义行的ListView。当这些行中的任何一个是 单击后,将重新生成 ListView 的数据。我想要这份清单 发生这种情况时滚动回顶部。

我最初尝试在每一行的OnClickListener 中使用setSelection(0) 实现这一目标但没有成功(我相信是因为ListView 当它的数据无效时失去它的滚动位置 - 所以我打电话给 setSelection 已撤消。我还是不明白 ListView 是怎么回事 决定在失效后滚动到哪里)。

我所知道的唯一可行的解​​决方案是 Romain Guy 在这里给出的: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

它涉及到 (View.post) 调用 _listView.setSelection(0)。一世 发现这表现很差。 新生成的列表显示其滚动位置不变 并且在滚动回顶部之前有相当长的延迟。

有没有更好的方法来实现这个功能?

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: android listview


    【解决方案1】:

    致电listView.setSelectionAfterHeaderView(); 滚动到顶部

    【讨论】:

    • 这正是我所说的。
    【解决方案2】:

    我尝试了很多,但这个对我有用

    list.smoothScrollToPosition(0);
    

    【讨论】:

    • 这太棒了。我想知道你是否可以改变滚动速度。
    • 是否还有一个回调来知道 scoll 何时结束,以便我可以导航到下一个屏幕?
    【解决方案3】:

    我只是使用listview.setSelection(0);

    对我来说很好。

    【讨论】:

      【解决方案4】:

      如果您需要在 ListView 适配器的数据更改后立即滚动,请注意它可能尚未填充。在这种情况下,您应该通过 Handler post() 您的 setSelection()setSelectionAfterHeaderView(),以便稍后在队列中调用它。

      listView.Handler.post(new Runnable() {
                  @Override
                  public void run() {
                      listView.setSelectionAfterHeaderView();    
                  }
              });
      

      这对我有用。

      【讨论】:

        【解决方案5】:

        就个人而言,我建议您找到不同的 UI 模式。用户可能会发现您当前的“点击,列表更改原位”的方法很直观,但我持怀疑态度。

        您可以尝试继承 ListView 并覆盖 layoutChildren() 以链接到超类,然后在需要时调用 setSelection(0)。如果“相当大的延迟”只是由于 post() 调用造成的,这应该可以解决。

        【讨论】:

        • 感谢您的建议,我会尽快试一试。由于面包屑显示在屏幕上的其他位置,因此列表原地更改 - 典型的 android UI 设计不太适合我的特定 UI 目标和目标用户。另外,感谢您的所有帮助 - 我已经阅读了您的许多 stackoverflow 答案和您的 CommonsWare 文献,它们极大地帮助了我开始使用这个平台!
        • 这就是这样做的方法,没有神奇的方法,只是纯粹的逻辑。谢谢!
        【解决方案6】:

        作为一种解决方法,您可以创建一个包含新重新生成数据的新适配器,然后调用 ListView.setAdapter。之后调用 ListView.setSelection(n)。

        顺便说一句,commonsware提供的解决方案是有效的。

        【讨论】:

          【解决方案7】:

          关于一些不同的要求。 如果您想在聊天时向上滚动。

                  mListView.smoothScrollToPosition(mAdapter.getCount());
          

          【讨论】:

            【解决方案8】:

            当你想从列表视图标题中集中编辑文本时,这个效果很好

            listview.setSelectionFromTop(0,0);
            

            如果你想从列表视图中选择特定的索引视图,那么

            listview.setSelection(index); // o for top
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多