Android ListView scrollTo

时间:2010-11-24 15:52:00

标签: android android-listview android-scroll

我有一个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以一种我甚至无法描述的方式表现出疯狂 ....

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

尝试将其添加到邮件队列

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

它在ScrollView(check this answer)中为我工作。

答案 1 :(得分:2)

我制作了可能对其他人有用的列表视图滚动功能,它们适用于我的每个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;
}