2010-07-22 72 views
9

我知道setSelection(),setSelectionFromTop()setSelectionAfterHeaderView(),但他們都沒有做我想做的事。在Android中很好地設置ListView滾動位置

鑑於列表中的項目,我想滾動以便它在視圖中。如果項目位於列表的可見窗口之上,我想滾動,直到項目是列表中的第一個可見項目;如果項目低於可見窗口,我希望它向上滾動,直到它是列表中最後一個可見項目。如果該項目已經可見,我不希望發生任何滾動。

我該如何解決這個問題?

+0

爲什麼你提到的這些方法不工作?當你選擇你想要的物品時會發生什麼? (我知道這是一個古老的問題,如果你現在已經解決了這個問題,請發佈你的解決方案,我將不勝感激) – HXCaine 2010-08-31 14:23:30

+0

@ T3Roar:我確實用setSelection()和setSelectionFromTop()擔心列表高度和項目高度,當然還有項目在列表中的位置。這恐怕是一團糟,我無法分享代碼 - 但它是可以解決的。也許如果我有機會,我會寫出一個我可以共享的通用解決方案,但是我現在所擁有的只是在我已經掌握的上下文之外沒有用。對不起! – 2010-08-31 15:48:50

+1

嗯,我很高興它只採取了一些使用setSelection()來實現而不是一些其他瘋狂的解決方法。感謝您的回覆:) – HXCaine 2010-08-31 16:40:35

回答

15

這是因爲listView尚未創建。嘗試後運行的,例如:

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
4

我想,我一直在尋找同樣的,後來我發現了以下解決方案:

if (listview.getFirstVisiblePosition() > pos 
    || listview.getLastVisiblePosition() <= pos) { 
    listview.smoothScrollToPosition(pos); 
} 

API 8需要使用smoothScrollToPosition(這是無論如何,一個合理的最低限度),所以你知道。

3

謝爾蓋的答案有效,但我相信正確的做法是設立一個觀察員,在ListView已經創建時得到通知。

listView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    scrollTo(scrollToPosition); 
    listView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
} 
}); 
+1

這是一個更好的解決方案,但不要忘記刪除監聽器: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel 2014-04-14 08:43:40

+0

謝謝Rocel。行listView.getViewTreeObserver()。removeGlobalOnLayoutListener(this)這樣做 – 2014-04-14 09:03:34

0

更好的解決方案,以Sergey's answer是以後調用setSelection()在活動/片段的生命週期,也許在onStart()。這樣,你就可以保證View已經準備就緒,而不是使用一些任意的延遲。