如何以编程方式滚动到中的特定位置ListView
?
例如,我有一个String[] {A,B,C,D....}
,我需要将的顶部可见项设置ListView
为的索引21 String[]
。
如何以编程方式滚动到中的特定位置ListView
?
例如,我有一个String[] {A,B,C,D....}
,我需要将的顶部可见项设置ListView
为的索引21 String[]
。
Answers:
直接滚动:
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);
干杯!!!
我设置了OnGroupExpandListener并将onGroupExpand()重写为:
并使用setSelectionFromTop()方法设置选定的项目,并将选择的y像素从ListView的顶部边缘定位。(如果处于触摸模式,则不会选择该项目,但仍会适当放置它。)(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);
如果有人在寻找类似功能的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使用UP / Down按钮滚动
如果有人对处理列表感兴趣,请使用按钮上/下一行。然后。
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
这对我有用。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);
您需要两件事来精确定义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);
}
}
});
}