Android ListView 滚动到底部

Posted

技术标签:

【中文标题】Android ListView 滚动到底部【英文标题】:Android ListView scroll to bottom 【发布时间】:2018-02-27 15:05:43 【问题描述】:

我正在开发带有聊天功能的应用程序,我希望我的ListView 在用户发布新消息以及用户位于列表底部并且收到新消息时滚动到底部。我正在使用这个ListView

<ListView
    android:id="@+id/list"
    android:layout_
    android:layout_
    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】:

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

您只需拨打notifyDataSetChanged(),您的列表就会自动滚动。

为了在大块的情况下处理滚动到绝对底部,您可以在每个列表项下方添加高度为 1 px 的列表项,这样无论您的项目高度是多少,您都将始终被引导到列表末尾。

【讨论】:

notifyDataSetChanged() 仅在一些常见的子类中实现,在 ListAdapter 或其他纯实现中不可用。 我将notifyDataSetChanged() 用于其他目的,并且每次执行时都不需要滚动。感谢您对 1 像素大小元素的帮助,这应该可以。但这听起来不是 100% 好的解决方案。如果不添加一些额外的元素,真的没有办法做到这一点吗? 有时黑客是唯一的方法:)

以上是关于Android ListView 滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

xamarin android c#Edittext自动滚动到底部

在颤动中加载项目后将Listview滚动到底部

listview滚动到底部

Flutter ListView 在构建时滚动到底部

点击按钮后如何将ListView向下滚动到底部(例如使用scrollToIndex)? NativeScript-Vue

react native 中listView怎么在滚动条滚动到底部的时候加载更多