web-dev-qa-db-ja.com

Android:ListView.getScrollY()-動作しますか?

私はそれを使用していますが、リストの最後までスクロールしたにもかかわらず、常に0を返します。

27
Danail

getScrollY()は、実際にはListViewではなく、Viewのメソッドです。ビュー全体のスクロール量を参照しているため、ほとんどの場合0になります。

ListViewのコンテンツがどこまでスクロールされているかを知りたい場合は、listView.getFirstVisiblePosition();を使用できます。

34
Cheryl Simon

それは機能し、ビューのスクロールされた部分の上部を表示されているビューの上部からピクセル単位で返します。を参照してください。 getScrollY() ドキュメント。基本的に、リストが完全に表示されている場合、リストのスクロールされた部分の上部は常に画面の上部にあるため、常に0になります。

リストの最後にいるかどうかを確認するために実行したいことは、次のようなものです。

public void onCreate(final Bundle bundle) {
     super.onCreate(bundle);
     setContentView(R.layout.main);
     // The list defined as field elswhere
     this.view = (ListView) findViewById(R.id.searchResults);
     this.view.setOnScrollListener(new OnScrollListener() {
          private int priorFirst = -1;
          @Override
          public void onScroll(final AbsListView view, final int first, final int visible, final int total) {
               // detect if last item is visible
               if (visible < total && (first + visible == total)) {
                    // see if we have more results
                    if (first != priorFirst) {
                         priorFirst = first;
                         //Do stuff here, last item is displayed, end of list reached
                    }
               }
          }
     });
}

PreviousFirstカウンターの理由は、スクロールイベントが複数回生成されることがあるため、リストの最後に最初に到達したときにのみ反応する必要があるためです。

自動拡張リストを作成しようとしている場合は、これをお勧めします チュートリアル

4
Dinedal

ListViewのスクロール位置を正確に定義するには、次の2つが必要です。

現在の位置を取得するには:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

位置を設定するには:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);
0
Rahul Ogale