在Android中很好地设置ListView滚动位置

时间:2010-07-22 21:06:49

标签: android listview scroll

我知道setSelection()setSelectionFromTop()setSelectionAfterHeaderView(),但他们似乎没有做我想做的事。

给定列表中的项目,我想滚动以便它在视图中。如果项目在列表的可见窗口上方,我想滚动直到该项目是列表中的第一个可见项目;如果项目在可见窗口下方,我希望它向上滚动,直到它是列表中的最后一个可见项目。如果该项目已经可见,我不希望发生任何滚动。

我该怎么做?

4 个答案:

答案 0 :(得分:15)

发生这种情况是因为尚未创建listView。尝试发布runnable,例如:

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

答案 1 :(得分:4)

我想,我一直在寻找相同的东西,然后我找到了以下解决方案:

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

API 8 需要使用smoothScrollToPosition(这是一个合理的最低限度),所以你知道。

答案 2 :(得分:3)

谢尔盖的答案有效,但我认为正确的做法是设置观察员,以便在创建ListView时收到通知。

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

答案 3 :(得分:0)

Sergey's answer的更好解决方案是稍后在活动/片段生命周期中调用setSelection(),可能在onStart()中。这样,您可以保证View已准备就绪,而不是使用任意延迟。