我知道setSelection()
,setSelectionFromTop()
和setSelectionAfterHeaderView()
,但他們都沒有做我想做的事。在Android中很好地設置ListView滾動位置
鑑於列表中的項目,我想滾動以便它在視圖中。如果項目位於列表的可見窗口之上,我想滾動,直到項目是列表中的第一個可見項目;如果項目低於可見窗口,我希望它向上滾動,直到它是列表中最後一個可見項目。如果該項目已經可見,我不希望發生任何滾動。
我該如何解決這個問題?
我知道setSelection()
,setSelectionFromTop()
和setSelectionAfterHeaderView()
,但他們都沒有做我想做的事。在Android中很好地設置ListView滾動位置
鑑於列表中的項目,我想滾動以便它在視圖中。如果項目位於列表的可見窗口之上,我想滾動,直到項目是列表中的第一個可見項目;如果項目低於可見窗口,我希望它向上滾動,直到它是列表中最後一個可見項目。如果該項目已經可見,我不希望發生任何滾動。
我該如何解決這個問題?
這是因爲listView尚未創建。嘗試後運行的,例如:
getListView().postDelayed(new Runnable() {
@Override
public void run() {
lst.setSelection(15);
}
},100L);
我想,我一直在尋找同樣的,後來我發現了以下解決方案:
if (listview.getFirstVisiblePosition() > pos
|| listview.getLastVisiblePosition() <= pos) {
listview.smoothScrollToPosition(pos);
}
API 8需要使用smoothScrollToPosition
(這是無論如何,一個合理的最低限度),所以你知道。
謝爾蓋的答案有效,但我相信正確的做法是設立一個觀察員,在ListView
已經創建時得到通知。
listView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
scrollTo(scrollToPosition);
listView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
這是一個更好的解決方案,但不要忘記刪除監聽器: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel 2014-04-14 08:43:40
謝謝Rocel。行listView.getViewTreeObserver()。removeGlobalOnLayoutListener(this)這樣做 – 2014-04-14 09:03:34
更好的解決方案,以Sergey's answer是以後調用setSelection()
在活動/片段的生命週期,也許在onStart()
。這樣,你就可以保證View已經準備就緒,而不是使用一些任意的延遲。
爲什麼你提到的這些方法不工作?當你選擇你想要的物品時會發生什麼? (我知道這是一個古老的問題,如果你現在已經解決了這個問題,請發佈你的解決方案,我將不勝感激) – HXCaine 2010-08-31 14:23:30
@ T3Roar:我確實用setSelection()和setSelectionFromTop()擔心列表高度和項目高度,當然還有項目在列表中的位置。這恐怕是一團糟,我無法分享代碼 - 但它是可以解決的。也許如果我有機會,我會寫出一個我可以共享的通用解決方案,但是我現在所擁有的只是在我已經掌握的上下文之外沒有用。對不起! – 2010-08-31 15:48:50
嗯,我很高興它只採取了一些使用setSelection()來實現而不是一些其他瘋狂的解決方法。感謝您的回覆:) – HXCaine 2010-08-31 16:40:35