我正在编写一个Android应用程序,其中包含一些包含一些项目的列表视图(按数据库提取,可以是100+) 我想滚动列表视图来显示特定项目(让我们说列表视图中的位置x)
listView.post(new Runnable() {
@Override
public void run() {
listView.smoothScrollToPosition(position);
}
});
视图已滚动。但是一旦项目出现就停止了。 (该项目现在显示在屏幕的底部) 我认为更好的设计是在屏幕顶部或至少在屏幕中间显示项目。 我怎么能这样做?
我现在找到了查找listview索引的方法,该索引在屏幕上真的可见。 我试过getFirstVisiblePosition()但似乎总是返回0.
答案 0 :(得分:1)
您会发现setSelection()
的效果优于smoothScrollToPosition()
。如果要在后台加载支持ListView的数据,则需要延迟发出setSelection()
,直到数据加载完毕。
getFirstVisiblePosition()
对我来说很好,但只有在加载完所有数据后才会有用。以下是我用于ListView的一些代码,它显示从远程站点获取的数据:
// the list has been updated, fix the selection. loadFinished will be true if there are no phantom placeholders left.
protected void listLoaded(boolean loadFinished) {
// if the user has scrolled or we previously completed resetting the position, do nothing
if(wasScrolled)
return;
// if we were restored from saved data, reload that data now.
if(listState != null) {
postListView.onRestoreInstanceState(listState);
listState = null;
} else if(initialPos >= 0) // if we had a specific initial position, set it now
setSelection(initialPos);
else if(postId >= 0) // or if there is a specific post ID we want displayed
setSelection(postAdapter.getPostPosition(postId));
else // otherwise scroll to the first unread post
setSelection(postAdapter.getFirstUnread());
if(loadFinished) // if all data has been loaded, set a flag to prevent this being repeated
wasScrolled = true;
}