2014年6月5日木曜日

Android : ListView が一番上 / 一番下にスクロールしたかを調べる

一つも要素がなければ、一番上でもあり一番下でもある。
要素がある場合は、子要素の位置と親要素(ListView 本体) の padding 位置を比較する。
OnScrollStateChanged 内でチェックするようにしても問題なく検出できる。
(一番上か一番下に到達してスクロールが止まると IDLE state になるらしい)
ただ、実際に試したところ onScroll 内で実行したほうがぴったりしたタイミングで検出できたので、
タイミングが重要な場合は onScroll 内でチェックしたほうが良い。

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if(view.getChildCount() == 0) {
            mAtTop = true;
            mAtBottom = true;
        } else {
            if(view.getFirstVisiblePosition() == 0 && view.getChildAt(0).getTop() == view.getPaddingTop()){
                mAtTop = true;
            } else {
                mAtTop = false;
            }
            if(view.getLastVisiblePosition() == totalItemCount - 1
            && view.getChildAt(view.getChildCount() - 1).getBottom() <= view.getBottom() - view.getPaddingBottom()){
                mAtBottom = true;
            } else {
                mAtBottom = false;
            }
        }
    }
});

0 件のコメント:

コメントを投稿