【发布时间】:2010-01-01 15:54:12
【问题描述】:
有没有一种方法可以确保 android listview 中的给定项目完全可见?
我希望能够以编程方式滚动到特定项目,例如当我按下按钮时。
【问题讨论】:
标签: android listview listactivity
有没有一种方法可以确保 android listview 中的给定项目完全可见?
我希望能够以编程方式滚动到特定项目,例如当我按下按钮时。
【问题讨论】:
标签: android listview listactivity
ListView.setSelection() 将滚动列表,以便所需的项目位于视口内。
【讨论】:
试试看:
public static void ensureVisible(ListView listView, int pos)
{
if (listView == null)
{
return;
}
if(pos < 0 || pos >= listView.getCount())
{
return;
}
int first = listView.getFirstVisiblePosition();
int last = listView.getLastVisiblePosition();
if (pos < first)
{
listView.setSelection(pos);
return;
}
if (pos >= last)
{
listView.setSelection(1 + pos - (last - first));
return;
}
}
【讨论】:
我相信你要找的是ListView.setSelectionFromTop()(虽然我参加聚会有点晚了)。
【讨论】:
最近我遇到了同样的问题,将我的解决方案粘贴在这里以防有人需要它(我试图使整个最后一个可见项目可见):
if (mListView != null) {
int firstVisible = mListView.getFirstVisiblePosition()
- mListView.getHeaderViewsCount();
int lastVisible = mListView.getLastVisiblePosition()
- mListView.getHeaderViewsCount();
View child = mListView.getChildAt(lastVisible
- firstVisible);
int offset = child.getTop() + child.getMeasuredHeight()
- mListView.getMeasuredHeight();
if (offset > 0) {
mListView.smoothScrollBy(offset, 200);
}
}
【讨论】:
ListView.smoothScrollBy 将滚动的数量有一个内部上限。那是因为它在内部模拟了用户投掷。使用这种方法滚动 10 个屏幕的项目只会滚动几个屏幕。
我有一个更短且在我看来更好的解决方案:ListView requestChildRectangleOnScreen 方法就是为此而设计的。
上面的答案确保了该项目将被显示,但有时它会部分显示(即当它位于屏幕底部时)。下面的代码确保显示整个项目并且视图将仅滚动必要的区域:
private void ensureVisible(ListView parent, View view) {
Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
parent.requestChildRectangleOnScreen(view, rect, false);
}
【讨论】:
View 不一定存在......如果它不可见,ListView 很可能会丢弃它。确实,smoothScrollToPosition 是一个很好的答案。