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

我怎样才能以编程方式滚动到ListView的特定位置?

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

对于直接滚动:

 getListView().setSelection(21); 

为了顺利滚动:

 getListView().smoothScrollToPosition(21); 

对于具有滚动持续时间的SmoothScroll:

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

参数
位置 – >滚动到的位置
偏移—->当滚动完成时,距视图顶部位置的所需距离(以像素为单位)
duration->用于滚动的毫秒数

注意:从API 11。

HandlerExploit的答案是我正在寻找,但我的列表视图是相当冗长,也与字母滚动。 然后我发现相同的function也可以采取其他参数:)


编辑:(从AFD的build议)

定位当前select:

 int h1 = mListView.getHeight(); int h2 = v.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); 

干杯!!!

我已经设置OnGroupExpandListener并覆盖onGroupExpand()为:

并使用setSelectionFromTop()方法设置所选项目,并从ListView的顶部边缘selecty像素。 (如果在触摸模式下,该项目将不会被选中,但仍然会被正确定位。)(android docs)

  yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { expList.setSelectionFromTop(groupPosition, 0); //your other code } }); 

Listview滚动将默认定位到顶部,但如果不可见则要滚动,然后使用以下命令:

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

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

如果有人有兴趣处理listView一行上/下使用button。 然后。

 public View.OnClickListener onChk = new View.OnClickListener() { public void onClick(View v) { int index = list.getFirstVisiblePosition(); getListView().smoothScrollToPosition(index+1); // For increment. } }); 

如果有人正在寻找类似Gmail应用程序的function,

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

listView.setSelection(int position);

如果你想顺利跳转到所需的位置在listView中使用

listView.smoothScrollToPosition(int position);

这是为我工作。 amalBit&Melbourne Lopes的答案组合

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

我发现这个解决scheme允许使用两个不同的button向上和向下滚动。

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