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,它也很有效。所以,我找到了解决我问题的办法!我不清楚的是,为什么会这样:/