40

ListView スクロールの正確なピクセル位置を取得したいと思います。いいえ、最初に見える位置について言及しているわけではありません。

これを達成する方法はありますか?

4

8 に答える 8

81

さて、私は次のコードを使用して回避策を見つけました:

View c = listview.getChildAt(0);
int scrolly = -c.getTop() + listview.getFirstVisiblePosition() * c.getHeight();

これが機能する方法は、最初に表示されるリストアイテムの実際のオフセットを取得し、ビューの上部からの距離を計算して、ビューに「スクロールイン」された量を決定することです。これで、計算できることがわかりました。残りは通常のgetFirstVisiblePositionメソッドを使用します。

于 2012-05-30T00:14:49.110 に答える
29

Saarraz1の答えは、リストビューのすべての行が同じ高さであり、ヘッダーがない場合(または、行と同じ高さである場合)にのみ機能します。

画面の上部に行が表示されなくなると、行の高さを追跡できなくなるため、行にアクセスできなくなることに注意してください。これが、これらの高さ(またはすべての累積高さ)を保存する必要がある理由です。私の解決策では、インデックスごとの高さの辞書を保持する必要があります(リストが最初に表示されたときに、リストが一番上にスクロールされると想定されています)。

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;
}
于 2012-11-16T11:02:15.557 に答える
12

まず、位置を保持するための int 変数を宣言します。

int position = 0;

次に、ListView に scrollListener を追加します。

listView.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
             position = firstVisibleItem;

        }
    });

次に、新しいデータまたはデータの変更を取得した後、リストビューの現在の位置を設定する必要があります

listView.setSelection(position);

アダプターをセットアップした後に使用しましたが、問題なく動作します..

于 2016-03-10T09:07:30.190 に答える