安卓ListView滚动到底部

3

我正在开发带有聊天功能的应用程序,当用户发布新消息并且在列表底部时,我希望我的ListView能够自动向下滚动。我正在使用以下ListView

<ListView
    android:id="@+id/list"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:stackFromBottom="true"
    android:paddingBottom="9dp"
    android:clipToPadding="false"/>

这是一种在需要时强制滚动的方法:

private void scrollListViewToBottom() {
        listView.setSelection(adapter.getCount() - 1);
}

但是当聊天内容包含高度大于屏幕高度的元素(大文本或图像)时,它会滚动到其顶部。我需要我的 ListView 滚动到底部,而不是最后一个元素。

我尝试使用 listView.scrollTo(0, listView.getBottom()) 方法,但结果非常奇怪 - 有时它会滚动到最后一条消息 + 半屏间隙,有时会滚动到我看不到任何消息的地方。

有什么想法吗?谢谢。

1个回答

13

你可以使用android:stackFromBottom="true"属性从下往上填充列表,并添加android:transcriptMode="alwaysScroll"属性以自动滚动您的列表视图。

只需调用notifyDataSetChanged()即可自动滚动您的列表。

为了处理大块情况下的滑动到底部,您可以在每个列表项下方添加高度为1像素的列表项,这样无论列表项的高度如何,您都将始终定位到列表末尾。


notifyDataSetChanged() 只在一些常见的子类中实现,而在 ListAdapter 或其他纯实现中不可用。 - bukkojot
我正在使用notifyDataSetChanged()来完成其他任务,我不需要每次执行它时都滚动。感谢您对1像素大小元素的帮助,这应该可以解决问题。但是听起来并不是100%好的解决方案。难道没有不添加额外元素就能实现这个技巧的方法吗? - Artem Samokhin
有时候黑客是唯一的出路 :) - Mr_Hmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接