我希望我的应用程序根据列表中的第一个可见项目进行一些屏幕上的更改(在ListView之外)。
我所做的是覆盖onScroll处理程序。调用此处理程序时,我将Cursor的位置设置为第一个可见位置,以便查看该行的数据:
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
mCursor.moveToPosition(getListView().getFirstVisiblePosition());
...
然后我引用光标中的数据来改变显示。
事情就是这样:这项工作很不稳定。大部分时间它都很完美。我不能搞砸了。
但是,有时getListView()。getFirstVisiblePosition()在第3项(索引2)确实是第一个可见项之前不会返回1。显示0索引时显示0。显示1索引时显示0。当2索引显示时显示1,依此类推。此外,它仅在用户向下滚动列表时执行此操作。如果用户向后滚动(向上),则getFirstVisiblePosition()返回正确的值。
我想知道这是否与某些效率问题无关。当用户滚动时,此处理程序将反复执行。
有没有人对可能出现的问题有任何想法?有没有人有更好的解决方案?
更新
我是否记得听说getFirstVisiblePosition()实际上只是一个猜测;并且Android基本上假设行的可能高度可能有哪些索引?如果是这样,那我就有问题了。我列表中的某些行比其他行大。如果是这种情况,有什么办法吗?
答案 0 :(得分:0)
我实际上会在onScrollStateChanged中执行您的调用,并且仅在滚动空闲时执行。您将大幅减少已执行请求的数量。像这样:
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
// do yer stuff
}
}