我有一个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以一种我甚至无法描述的方式表现出疯狂 ....
有什么想法吗?
答案 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;
}