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

すべてのアイテム タイプのサイズがわかっていると仮定します。

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 に答える