ListView スクロールの正確なピクセル位置を取得したいと思います。いいえ、最初に見える位置について言及しているわけではありません。
これを達成する方法はありますか?
ListView スクロールの正確なピクセル位置を取得したいと思います。いいえ、最初に見える位置について言及しているわけではありません。
これを達成する方法はありますか?
さて、私は次のコードを使用して回避策を見つけました:
View c = listview.getChildAt(0);
int scrolly = -c.getTop() + listview.getFirstVisiblePosition() * c.getHeight();
これが機能する方法は、最初に表示されるリストアイテムの実際のオフセットを取得し、ビューの上部からの距離を計算して、ビューに「スクロールイン」された量を決定することです。これで、計算できることがわかりました。残りは通常のgetFirstVisiblePositionメソッドを使用します。
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;
}
まず、位置を保持するための 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);
アダプターをセットアップした後に使用しましたが、問題なく動作します..