Android ListView滚动到

Android ListView滚动到,android,android-listview,android-scroll,Android,Android Listview,Android Scroll,我有一个LinearLayout,其中包含一些其他视图,还有一个ListView。 通过单击按钮从另一个视图加载此视图 此按钮以某种方式指定ListView中的哪个元素需要成为列表中第一个可见的元素。填充列表的元素通过HTTP从外部服务器检索 问题是我可以让第n个元素成为列表中的第一个元素。 请注意,我不想将其从当前位置移动到新位置,我希望列表滚动 我试过setSelected()和scrollTo(x,y)和scrollBy(x,y),但运气不好 我也尝试过这段代码,虽然它很难看,但我只想尝试

我有一个
LinearLayout
,其中包含一些其他视图,还有一个
ListView
。 通过单击按钮从另一个视图加载此视图

此按钮以某种方式指定ListView中的哪个元素需要成为列表中第一个可见的元素。填充列表的元素通过HTTP从外部服务器检索

问题是我可以让第n个元素成为列表中的第一个元素。 请注意,我不想将其从当前位置移动到新位置,我希望列表滚动

我试过
setSelected()
scrollTo(x,y)
scrollBy(x,y)
,但运气不好

我也尝试过这段代码,虽然它很难看,但我只想尝试一下它是否有效:

ListView categoryList = (ListView)findViewById(R.id.category_list);
        categoryList.post(new Runnable() {
            @Override
            public void run() {
                Log.d(this.getClass().getName(), "CategoryActivity.scrollToIndex: " + CategoryActivity.scrollToIndex);
                if(CategoryActivity.scrollToIndex>0){
                    ListView categoryList = (ListView)findViewById(R.id.category_list);
                    categoryList.setScrollContainer(true);
                    categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
                    categoryList.requestLayout();

                }
            }
        });
这让我获得了一些成功,但ListView当时表现得很疯狂,我甚至无法形容


有什么想法吗?

尝试将其添加到消息队列中

categoryList.post(new Runnable() {
    public void run() {
        categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
    }
});

它在ScrollView()中对我有效。

我制作了一些函数,这些函数对其他人的listview滚动非常有用,它们适用于所有android版本、模拟器和设备,这里itemheight是listview中的固定视图高度

int itemheight=60;
public void scrollToY(int position)
{
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public void scrollByY(int position)
{
    position+=getListScrollY();
    int item=(int)Math.floor(position/itemheight);
    int scroll=(int) ((item*itemheight)-position);
    this.setSelectionFromTop(item, scroll);// Important
}
public int getListScrollY()
{
    try{
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important
    View v=this.getChildAt(0);
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important
    return tempscroll;
    }catch(Exception e){}
    return 0;
}

我也尝试过使用setSelected,它也很有效。所以,我找到了解决我问题的办法!我不清楚的是,为什么会这样:/