如何将ListView中的目标项显示在屏幕顶部

时间:2014-01-04 05:02:05

标签: android listview scrollview

我正在编写一个Android应用程序,其中包含一些包含一些项目的列表视图(按数据库提取,可以是100+) 我想滚动列表视图来显示特定项目(让我们说列表视图中的位置x)

listView.post(new Runnable() {
    @Override
    public void run() {
        listView.smoothScrollToPosition(position);
    }
});

视图已滚动。但是一旦项目出现就停止了。 (该项目现在显示在屏幕的底部) 我认为更好的设计是在屏幕顶部或至少在屏幕中间显示项目。 我怎么能这样做?

我现在找到了查找listview索引的方法,该索引在屏幕上真的可见。 我试过getFirstVisiblePosition()但似乎总是返回0.

1 个答案:

答案 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;
}