Android Wait unitl ListView';s smoothScrollToPosition()完成 范围
我需要平滑地滚动到某个位置,然后使用Android Wait unitl ListView';s smoothScrollToPosition()完成 范围,android,listview,smooth-scrolling,Android,Listview,Smooth Scrolling,我需要平滑地滚动到某个位置,然后使用setSelection(另一个位置)跳转到另一个位置。这样做是为了在列表视图中创建(例如)100个项目平滑滚动的幻觉平滑滚动位置(100)持续时间太长,你知道 问题 setSelection()不会等到SmoothScrollTopositon完成它的工作,所以setSelection()会立即被调用,用户只能看到快速跳转 代码 当然,滚动方向等需要根据您的用例进行调整(转到列表顶部) 编辑:如果滚动速度过高,旧的解决方案可能会超调,smoothScroll
setSelection(另一个位置)
跳转到另一个位置。这样做是为了在列表视图中创建(例如)100个项目平滑滚动的幻觉<代码>平滑滚动位置(100)
持续时间太长,你知道
问题
setSelection()
不会等到SmoothScrollToposito
n完成它的工作,所以setSelection()
会立即被调用,用户只能看到快速跳转
代码
当然,滚动方向等需要根据您的用例进行调整(转到列表顶部)
编辑:如果滚动速度过高,旧的解决方案可能会超调,smoothScrollBy(0,0)将在正确且立即设置选择之前停止平滑滚动。另一种方法是添加OnScrollListener
private final int scrollableItems = 20;
int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
mListView.smoothScrollToPosition(0);
} else {
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
if (i == SCROLL_STATE_IDLE) {
mListView.setSelection(0);
}
}
})
mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
}
mListView.clearFocus();
private final int scrollableItems=20;
int firstVisiblePosition=mListView.getFirstVisiblePosition();
if(firstVisiblePosition
但它可能仅适用于具有固定高度项目的列表。我认为mListView.setSelection(scrollableItems);mListView.smoothScrollToPosition(0);更可取的方法;)是的,它只是用来获得合适的高速。只要将视图的高度*数量替换为任何其他适当大的值(即,如果视图的大小变化很大),您将获得足够快的滚动,当您使用Runnable中的setSelection(0)捕捉到ListView时,用户不会注意到。
int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
mListView.smoothScrollToPosition(0);
} else {
mListView.setSelection(scrollableItems);
mListView.smoothScrollToPosition(0);
}
mListView.clearFocus();
final ListView listView = ...;
View listItemView = ...;
listView.smoothScrollBy(listItemView.getHeight() * NUMBER_OF_VIEWS,
DURATION * 2);
listView.postDelayed(new Runnable() {
public void run() {
listView.smoothScrollBy(0, 0); // Stops the listview from overshooting.
listView.setSelection(0);
}
}, DURATION);
private final int scrollableItems = 20;
int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
mListView.smoothScrollToPosition(0);
} else {
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
if (i == SCROLL_STATE_IDLE) {
mListView.setSelection(0);
}
}
})
mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
}
mListView.clearFocus();