2017-09-19 200 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

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