Android listView 找到滚动的像素数量

标签 android scroll

我有一个 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/

相关文章:

android - 在Android中实现人脸识别

android - 如果我的国家/地区无法使用已发布的Google Play应用,该如何测试?

ios - UIScrollView.contentSize 似乎随着缩放而增长

javascript - 计算 div 左边缘与视口(viewport)左边缘之间的水平视差距离

ios - 以编程方式滚动 UIScrollView

android - setComponentEnabledSetting 如何工作?

android - 在不扩展 FragmentActivity 的情况下获取 SupportFragmentManager

Android TabLayout 选中的tab背景

html - 水平滚动部分可防止 css 和 html 中的换行

javascript - 滚动时将每个 div 视为 "page"