1

在 android 中,如何获取列表视图的滚动位置?

我知道我可以使用以下代码检索统一填充列表视图的滚动位置:

int scrollY = -this.getChildAt(0).getTop() + this.getFirstVisiblePosition()* this.getChildAt(0).getHeight();

代码假定列表视图中所有子项(项目)的高度都相等(this.getChildAt(0).getHeight()

现在,如果我用大小不等的项目填充我的列表视图,我如何获得正确的滚动位置?

我的列表视图看起来像这样: 在此处输入图像描述

这就是为什么我需要滚动位置:

private Canvas drawIndicator(Canvas canvas) {

    int scrollY = getCurrentScrollPosition();



    paint.setColor(Color.GRAY);
    paint.setAlpha(100);
    canvas.drawRect(getLeft(), indicatorPosition[0] - scrollY, getRight(), indicatorPosition[1]
            - scrollY, paint);

     //Log.d(VIEW_LOG_TAG, "drawIndicator:" + (indicatorPosition[1] -
     //scrollY));

    paint.setColor(Color.parseColor("#47B3EA"));
    canvas.drawRect(getLeft(), indicatorPosition[1] - scrollY - (indicatorHeight / 2),
            getRight(), indicatorPosition[1] - scrollY + indicatorHeight, paint);

    return canvas;
}

我需要绘制一个跟随列表视图滚动的指示器

我会像这样调用它

@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas = drawIndicator(canvas);
    super.onDraw(canvas);
    canvas.restore();
}
4

3 回答 3

3

假设您知道 All your items type 的大小:

int currentY = 0;
        for (int i = 0; i < listView.getFirstVisiblePosition(); i++) {

            int type = listView.getAdapter().getItemViewType(i);
            currentY += getHightForViewType(type);
        }

        int scrollY = -listView.getChildAt(0).getTop() + currentY;

并使用您的适配器:

 private int getHightForViewType(int itemViewType) {

        int hightItem;
        switch (itemViewType) {
            case 0:
                hightItem = 100;
                break;

            default:
                hightItem = 60;
                break;
        }
        return hightItem;

    }
于 2012-09-27T16:09:47.050 回答
1

或者:

private Dictionary<Integer, Integer> listViewItemHeights = new Hashtable<Integer, Integer>();

private int getScroll() {
    View c = listView.getChildAt(0); //this is the first visible row
    int scrollY = -c.getTop();
    listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight());
    for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) {
        if (listViewItemHeights.get(i) != null) // (this is a sanity check)
            scrollY += listViewItemHeights.get(i); //add all heights of the views that are gone
    }
    return scrollY;
}

这应该在以下位置调用:

public void onScroll(AbsHListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

仅当手动从位置 0 滚动时才有效,而不是以编程方式。

于 2013-08-16T09:47:59.180 回答
0

我遇到了同样的问题,但是我在每个项目中使用了带有随机长度文本的 listView,因此我事先不知道项目高度。我的实现:

private static int[] heights;

public static int getScrollY(ListView lv) {
  if (heights == null || lv.getCount() != heights.length) {
        heights = new int[lv.getCount()];
    }
    View c = lv.getChildAt(0);
    if (c == null) {
        return 0;
    }

    int firstVisiblePosition = lv.getFirstVisiblePosition();
    if (firstVisiblePosition < lv.getCount() && heights[firstVisiblePosition + 1] == 0) {
        heights[firstVisiblePosition + 1] += heights[firstVisiblePosition] + c.getHeight();
    }
    return -c.getTop() + heights[firstVisiblePosition];
}

我认为如果 listView 的任何元素发生更改(添加/删除/更改高度),就会出现问题。滚动 listView 时也会计算高度,如果以编程方式滚动 listView 则会出现问题。这很可悲,listView 实现阻止了轻松访问滚动 Y 位置:(

于 2014-07-12T11:14:06.333 回答