2017-09-19 159 views
0

我正在开发聊天应用,我希望我的ListView在用户发布新消息时以及当用户位于列表底部并收到新消息时滚动到底部。我用这ListViewAndroid 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())方法,但结果很奇怪 - 它有时会滚动到最后一条消息+半屏幕间隙,有时会滚动到我看不到任何消息的地方。

任何想法?谢谢。

回答

5

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

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

为了在大块的情况下处理滚动到绝对底部,可以在每个列表项下添加高度为1 px的列表项,这样无论项目的高度如何,您都将被定向到列表的末尾。

+0

'notifyDataSetChanged()'仅在一些常用的子类中实现,并且在ListAdapter或其他纯粹的实现中不可用。 – bukkojot

+0

我使用'notifyDataSetChanged()'作为另一个用途,每次执行它时都不需要滚动。感谢1像素大小的元素的帮助,这应该工作。但这听起来并不是100%的好解决方案。如果不添加一些额外的元素,是否真的没有办法做到这一点? –

+0

有时候黑客是唯一的方法:) –