我知道setSelection()
,setSelectionFromTop()
和setSelectionAfterHeaderView()
,但他们似乎没有做我想做的事。
给定列表中的项目,我想滚动以便它在视图中。如果项目在列表的可见窗口上方,我想滚动直到该项目是列表中的第一个可见项目;如果项目在可见窗口下方,我希望它向上滚动,直到它是列表中的最后一个可见项目。如果该项目已经可见,我不希望发生任何滚动。
我该怎么做?
答案 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已准备就绪,而不是使用任意延迟。