以编程方式滚动到 Android ListView 中的特定位置
Posted
技术标签:
【中文标题】以编程方式滚动到 Android ListView 中的特定位置【英文标题】:Programmatically scroll to a specific position in an Android ListView 【发布时间】:2011-11-25 13:21:48 【问题描述】:如何以编程方式滚动到 ListView
中的特定位置?
例如,我有一个String[] A,B,C,D....
,我需要将ListView
的顶部可见项设置为我的String[]
的索引21。
【问题讨论】:
Is it possible to scroll ListView to a listrow's child element?的可能重复 在这里查看我的答案,***.com/a/29345217/1881527 【参考方案1】:对于直接滚动:
getListView().setSelection(21);
为了平滑滚动:
getListView().smoothScrollToPosition(21);
【讨论】:
酷,这正是我想要的! 太好了,非常有用。它节省了我的时间。谢谢。 另一个区别:第一个尝试设置在列表的中间。smoothScrollToPosition
不起作用,有什么建议吗?
@SweetWisherツ 尝试发布延迟执行,例如:listView.post(() -> listView.smoothScrollToPosition());
【参考方案2】:
对于具有滚动持续时间的 SmoothScroll:
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);
【讨论】:
工作正常。为了改善您的答案,可以按照***.com/questions/5540223/… 中的说明计算偏移量 什么是 v.getHeight()? @Panache v 是列表视图的行【参考方案3】:将您的代码按如下方式放入处理程序中,
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);
干杯!!!
【讨论】:
【参考方案4】:默认情况下Listview
滚动将定位到顶部,但如果不可见则想要滚动然后使用这个:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
【讨论】:
谢谢@zalak 解决我的问题,放弃【参考方案5】:我已设置 OnGroupExpandListener 并将 onGroupExpand() 覆盖为:
并使用 setSelectionFromTop() 方法 设置所选项目并从 ListView 的顶部边缘定位选择 y 像素。 (如果处于触摸模式,该项目将不会被选中,但仍会被正确定位。)(android 文档)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
@Override
public void onGroupExpand(int groupPosition)
expList.setSelectionFromTop(groupPosition, 0);
//your other code
);
【讨论】:
我需要在滚动 lisview 的同时滚动另一个视图。在 listview 上使用 setSelectionFromTop 进行滚动会阻塞 UI 线程,这会使另一个视图的滚动变慢。可以给点建议吗?【参考方案6】:如果有人正在寻找类似 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);
【讨论】:
【参考方案7】:如果你想直接跳转到 listView 中的所需位置,只需使用
listView.setSelection(int position);
如果您想在 listView 中顺利跳转到所需位置,只需使用
listView.smoothScrollToPosition(int position);
【讨论】:
【参考方案8】:使用 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.
);
【讨论】:
我给你投票只是因为你是唯一一个展示了获得当前位置的方法的人,但你应该改进示例。【参考方案9】:这对我有用。 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);
【讨论】:
【参考方案10】:这很容易
list-view.set selection(you pos);
或者您可以使用SharedPreference
保存您的位置,并在您开始活动时
它得到偏好和setSeletion
到那个int
【讨论】:
我想要做的就是自动移动到列表的顶部,没有任何滚动动画......这非常适合【参考方案11】:-如果您只想让列表向上\黎明滚动到特定位置:
myListView.smoothScrollToPosition(i);
-如果要获取特定项在myListView中的位置:
myListView.getItemAtPosition(i);
-这个myListView.getVerticalScrollbarPosition(i);
can 也可以帮助你。
祝你好运:)
【讨论】:
【参考方案12】:你需要两件事来精确定义 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);
【讨论】:
【参考方案13】:我发现这个解决方案允许使用两个不同的按钮向上和向下滚动。
根据@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);
);
【讨论】:
以上是关于以编程方式滚动到 Android ListView 中的特定位置的主要内容,如果未能解决你的问题,请参考以下文章