以编程方式滚动到 Android ListView 中的特定位置

如何以编程方式滚动到 ListView中的特定位置?

例如,我有一个 String[] {A,B,C,D....},并且我需要将 ListView的顶部可见项目设置为 String[]的索引21。

179012 次浏览

直接卷轴:

getListView().setSelection(21);

要想画得流畅:

getListView().smoothScrollToPosition(21);

我已经将 OnGroupExpandListener 设置为:

并使用 setSelectionFromTop ()方法 设置选定的项,并将选定的 y 像素从 ListView 的顶部边缘定位。(如果处于触摸模式,该项目将不会被选中,但它仍将处于适当的位置。)(机器人文档)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{


@Override
public void onGroupExpand(int groupPosition) {


expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});

对于带有卷轴持续时间的滑动卷轴:

getListView().smoothScrollToPositionFromTop(position,offset,duration);

参数
位置-> 滚动到的位置
当滚动完成时,从视图顶部以位置像素为单位的期望距离
长度-> 用于滚动的毫秒数

注: From API 11。

Handler滥用的答案是什么,我正在寻找,但我的列表视图是相当长,也与字母滚动器。然后我发现同样的函数也可以接受其他参数:)


编辑: (来自 AFDs 的建议)

要定位当前选定内容:

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);

干杯! ! !

使用 UP/Down using. 按钮处理 listView 滚动

如果有人对使用按钮处理 listView 上下一行感兴趣,那么。

public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {


int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.


}
});

我发现这个解决方案允许上下滚动使用两个不同的按钮。

正如@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);
}


}
});
}

如果有人在寻找类似的功能,比如 Gmail 应用程序,

默认情况下,Listview 滚动条将位于顶部。谢谢提示。 amalBit. 减去它,就这样。

 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 中所需的位置,只需使用

SetSelection (int 位置) ;

如果你想平稳地跳转到 listView 中想要的位置,只需要使用

平滑滚动到位置(int 位置) ;

这是什么工作对我来说。组合的答案由 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);

默认情况下,Listview滚动条会被放置在顶部,但是如果想要滚动,如果不可见,那么使用以下方法:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);

很简单 list-view.set selection(you pos); 或者你可以保存你的位置与 SharedPreference和当你开始活动 它得到首选项和 setSeletion到那个 int

如果你只是想让列表滚动到一个特定的位置:

myListView.smoothScrollToPosition(i);

- 如果你想得到 myListView 中特定条目的位置:

myListView.getItemAtPosition(i);

这个 myListView.getVerticalScrollbarPosition(i);也可以帮助你。

祝你好运

要精确定义 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);