我有一个 ListView 。当我滚动并停在特定位置时。
如何获得滚动的像素数量(从顶部开始)?
我试过使用 get listView.getScrollY(),但它返回 0。
最佳答案
我遇到了同样的问题。
我不能使用 View.getScrollY() 因为它总是返回 0 并且我不能使用 OnScrollListener.onScroll(...) 因为它适用于位置而不是像素。我不能继承 ListView 并覆盖 onScrollChanged(...),因为它的参数值始终为 0。嗯。
我只想知道子项(即 ListView 的内容)向上或向下滚动的数量。所以我想出了一个解决方案。我跟踪其中一个子项(或者您可以说是“行”之一)并跟踪其垂直位置变化。
代码如下:
public class ObservableListView extends ListView {
public static interface ListViewObserver {
public void onScroll(float deltaY);
}
private ListViewObserver mObserver;
private View mTrackedChild;
private int mTrackedChildPrevPosition;
private int mTrackedChildPrevTop;
public ObservableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mTrackedChild == null) {
if (getChildCount() > 0) {
mTrackedChild = getChildInTheMiddle();
mTrackedChildPrevTop = mTrackedChild.getTop();
mTrackedChildPrevPosition = getPositionForView(mTrackedChild);
}
} else {
boolean childIsSafeToTrack = mTrackedChild.getParent() == this && getPositionForView(mTrackedChild) == mTrackedChildPrevPosition;
if (childIsSafeToTrack) {
int top = mTrackedChild.getTop();
if (mObserver != null) {
float deltaY = top - mTrackedChildPrevTop;
mObserver.onScroll(deltaY);
}
mTrackedChildPrevTop = top;
} else {
mTrackedChild = null;
}
}
}
private View getChildInTheMiddle() {
return getChildAt(getChildCount() / 2);
}
public void setObserver(ListViewObserver observer) {
mObserver = observer;
}
}
注意事项:
- 我们重写 onScrollChanged(...) 因为它在 ListView 滚动时被调用(只是它的参数没用)
- 然后我们从中间选择一个 child (行)(不必恰好是中间的 child )
- 每次发生滚动时,我们都会根据被跟踪子项的先前位置 (getTop()) 计算垂直移动
- 我们会在跟踪 child 不安全时停止跟踪 child (例如,在可能被重复使用的情况下)
关于Android listView 找到滚动的像素数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471075/