【发布时间】:2011-11-25 13:21:48
【问题描述】:
如何以编程方式滚动到 ListView 中的特定位置?
例如,我有一个String[] {A,B,C,D....},我需要将ListView 的顶部可见项设置为我的String[] 的索引21。
【问题讨论】:
-
在这里查看我的答案,stackoverflow.com/a/29345217/1881527
如何以编程方式滚动到 ListView 中的特定位置?
例如,我有一个String[] {A,B,C,D....},我需要将ListView 的顶部可见项设置为我的String[] 的索引21。
【问题讨论】:
对于直接滚动:
getListView().setSelection(21);
为了平滑滚动:
getListView().smoothScrollToPosition(21);
【讨论】:
smoothScrollToPosition 不起作用,有什么建议吗?
listView.post(() -> listView.smoothScrollToPosition());
getListView().smoothScrollToPositionFromTop(position,offset,duration);
参数
position -> 要滚动到的位置
偏移量---->滚动完成时距离视图顶部的位置像素所需的距离
duration-> 用于滚动的毫秒数
注意:来自 API 11。
HandlerExploit 的答案是我一直在寻找的,但我的列表视图很长,而且还带有字母滚动条。然后我发现同一个函数也可以带其他参数:)
编辑:(来自 AFD 的建议)
定位当前选择:
int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();
mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);
【讨论】:
将您的代码按如下方式放入处理程序中,
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
lstView.smoothScrollToPosition(YOUR_POSITION);
} catch (Exception e) {}
}
}, time);
}
然后像这样调用这个方法,
timerDelayRunForScroll(100);
干杯!!!
【讨论】:
默认情况下Listview 滚动将定位到顶部,但如果不可见则想要滚动然后使用这个:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
【讨论】:
我已设置 OnGroupExpandListener 并将 onGroupExpand() 覆盖为:
并使用 setSelectionFromTop() 方法 设置所选项目并从 ListView 的顶部边缘定位选择 y 像素。 (如果处于触摸模式,该项目将不会被选中,但仍会被正确定位。)(android 文档)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{
@Override
public void onGroupExpand(int groupPosition) {
expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});
【讨论】:
如果有人正在寻找类似 Gmail 应用的功能,
默认情况下,Listview 滚动将定位到顶部。感谢您的提示。 阿马尔比特。 只需减去它。就是这样。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
int h1 = mDrawerList.getHeight();
int h2 = header.getHeight();
mDrawerList.smoothScrollToPosition(h2-h1);
}
}, 1000);
【讨论】:
如果你想直接跳转到 listView 中的所需位置,只需使用
listView.setSelection(int position);
如果您想在 listView 中顺利跳转到所需位置,只需使用
listView.smoothScrollToPosition(int position);
【讨论】:
使用 UP/Down using.button 处理 listView 滚动
如果有人有兴趣使用按钮处理 listView 上/下一行。那么。
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
【讨论】:
这对我有用。 amalBit 和墨尔本洛佩斯的答案组合
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
int h1 = mListView.getHeight();
int h2 = v.getHeight();
mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);
} catch (Exception e) {}
}
}, time);
}
然后像这样调用这个方法:
timerDelayRunForScroll(400);
【讨论】:
这很容易
list-view.set selection(you pos);
或者您可以使用SharedPreference 保存您的位置,并在您开始活动时
它得到偏好和setSeletion 到那个int
【讨论】:
-如果您只想让列表向上\黎明滚动到特定位置:
myListView.smoothScrollToPosition(i);
-如果要获取特定项在myListView中的位置:
myListView.getItemAtPosition(i);
-这个myListView.getVerticalScrollbarPosition(i);can 也可以帮助你。
祝你好运:)
【讨论】:
你需要两件事来精确定义 listView 的滚动位置:
获取当前listView的滚动位置:
int firstVisiblePosition = listView.getFirstVisiblePosition();
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
设置listView的滚动位置:
listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo..
listView.scrollTo(0,-topEdge);
【讨论】:
我发现这个解决方案允许使用两个不同的按钮向上和向下滚动。
根据@Nepster 的建议,我使用 getFirstVisiblePosition() 和 getLastVisiblePosition() 以编程方式实现滚动以获取当前位置。
final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
.....
if (list.size() > 0) {
ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
}else{
lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());
}
}
});
bnt = (ImageButton) findViewById(R.id.up_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getFirstVisiblePosition()>0){
lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
}else{
lwresult.smoothScrollToPosition(0);
}
}
});
}
【讨论】: