ListView 載入資料後,需自動滾動至最後一筆或指定位置。smoothScrollToPosition() 有動畫但較慢,大量資料時體驗不佳。
| 方法 | 特性 | 適用場景 |
|---|---|---|
setSelection(position) | 瞬間跳轉,無動畫 | 初始化定位、大量資料、效能優先 |
smoothScrollToPosition(position) | 平滑動畫滾動 | 用戶觸發操作、資料量小、需視覺提示 |
setSelectionFromTop(position, offset) | 指定項目距頂部偏移量 | 需保留標題欄、特定視覺對齊 |
ListView listView = findViewById(R.id.list_view);
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
// 1. 瞬間跳到最後一筆 (最常用)
listView.setSelection(adapter.getCount() - 1);
// 2. 平滑滾動到最後 (用戶操作後)
listView.smoothScrollToPosition(adapter.getCount() - 1);
// 3. 跳到指定位置並距頂部 50px
listView.setSelectionFromTop(10, 50);
// 4. 確保資料綁定完成後再滾動 (關鍵)
listView.post(() -> listView.setSelection(adapter.getCount() - 1));
setAdapter() 之後,或用 post() 延遲執行position >= 0 && position < adapter.getCount()recyclerView.scrollToPosition(pos) 或 layoutManager.scrollToPositionWithOffset(pos, offset)// 新增資料後
adapter.notifyDataSetChanged();
// 只有當用戶已在底部時才自動滾動
if (isLastItemVisible()) {
listView.post(() -> listView.setSelection(adapter.getCount() - 1));
}
private boolean isLastItemVisible() {
int lastPos = listView.getLastVisiblePosition();
return lastPos == adapter.getCount() - 1;
}