我想在每次滚动/投掷后让ListView重新排列。通过重新调整,我的意思是重新排列,使ListView的顶部项目与ListView的顶部对齐,如果它被切断,它应该平滑地向下滚动,直到它重新对齐并完全可见。
我实现了一个scroll-listener:
firstRowListView.setOnScrollListener(new OnScrollListener() {
private boolean correcting = false;
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(AbsListView arg0, int scrollState) {
if (!correcting && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
correcting = true;
firstRowListView.smoothScrollToPosition(firstRowListView.getFirstVisiblePosition());
correcting = false;
}
}
}
});
(为了更容易查看,我只留下重要的位)。如果我顺利滚动(没有投掷)它工作正常,但如果我扔掉列表它不会重新调整自己。虽然LogCat告诉我onScrollStateChange-method的执行方式与执行“普通”滚动时的执行方式相同。
为什么这样,以及如何在Fling之后让ListView重新调整?
答案 0 :(得分:1)
以下应该可以工作但是在Galaxy tab 7(4.0.4)上我可以看到递归发生。因此,我强烈建议您实施一些机制来避免这种情况,否则此解决方案将在某些设备上中断:
mylv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(final AbsListView lv,
int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
lv.post(new Runnable() {
@Override
public void run() {
lv.smoothScrollToPosition(lv
.getFirstVisiblePosition());
}
});
}
}
});
答案 1 :(得分:0)
在较早的设备ListView
上SCROLL_STATE_IDLE
之后不会报告SCROLL_STATE_TOUCH_SCROLL
。请使用此处提到的解决方法。 http://code.google.com/p/android/issues/detail?id=5086#c7
您也可以安全地删除correcting
变量,因为在此代码中没有用。