【问题标题】:How to scroll to the bottom of ListView programmatically?如何以编程方式滚动到 ListView 的底部?
【发布时间】:2010-03-29 09:56:14
【问题描述】:

调用notifydatasetchanged(); 后,我想滚动到列表底部,以便用户看到列表视图中的最后一条记录。

(我正在编写聊天模块,因此为此我需要在列表底部显示最新记录)

谁能指导我如何实现这一目标?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    我知道这个问题已经得到解答,而你接受了答案,那是一年多以前的事了。但更好的方法是转录模式。有关演示,请参阅 Views > Lists > Transcript 下的 Android API 演示。

    您可以在 XML 的列表视图中设置以下内容。

    android:stackFromBottom="true"
    android:transcriptMode="alwaysScroll"
    

    无论何时拨打notifyDataSetChanged(),它都将始终有效。如果您希望聊天应用程序获得更好的结果,您可以将 android:transcriptMode 设置为 normal:只有当最后一个项目已经在视图中时,它才会滚动到底部。这样,您的用户可以在其他用户聊天时不间断地查看之前的聊天记录。

    【讨论】:

    • 非常感谢! android:transcriptMode 很神奇 :) 你救了我!
    • 问题在于“如果我的列表视图中只有一个元素,那它将是屏幕的底部。”
    【解决方案2】:

    试试

    listView.post(new Runnable(){
      public void run() {
        listView.setSelection(listView.getCount() - 1);
      }});
    

    根据我的经验,“帖子”似乎有时需要,特别是如果您最近更新了列表。

    【讨论】:

    • 这很好用。我之前尝试过android:stackFromBottom="true",然后问题是如果我的列表视图中只有一个元素,它将是屏幕的底部。谢谢
    • 注意:如果最后一个元素的高度大于列表视图的高度,则最后一个元素的顶部将与列表顶部对齐,即元素的底部不会可见的。这就是为什么 Ribose 描述的 stackFromBottom 解决方案更适合类似聊天的功能。
    • 工作就像一个魅力!我也尝试了 stackFromBottom="true" 但由于我没有清除列表,因此不适用于我的情况。 (至少我认为这就是原因。)
    • 你说得对,如果在notifyDataSetChanged() 之后直接调用,post 是必需的。使用post 会推迟setSelection(),直到列表的更新/刷新完成。
    【解决方案3】:

    我知道现在回答很晚,但可能会对某人有所帮助。使用 android:transcriptMode="alwaysScroll" 将强制列表视图滚动到底部(因为我们在这里使用了android:stackFromBottom="true"),即使您尝试滚动顶部通常需要大部分时间。因此,您可以使用android:transcriptMode="normal 而不是android:transcriptMode="alwaysScroll,它的行为类似于聊天应用程序的要求,并且如果用户想在顶部看到内容,则不会始终强制滚动列表。

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 2011-12-22
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2018-12-13
      • 2018-11-22
      相关资源
      最近更新 更多