首页 > 代码库 > ListView中的setOnScrollListener

ListView中的setOnScrollListener

ListView是Android中最常用的控件之一,随着时代发展,RecyclerView有取代它的趋势,但是在一些老代码中,ListView依然扮演着重要的作用。
项目中遇到一个需求,需要监听ListView在滑动时滑动的Y轴坐标。这个需求在RecyclerView中computeVerticalScrollOffset方法完成了这项功能。只需要在OnScrollListener的onScrolled方法中,调用computeVerticalScrollOffset即可在滑动时获得Y坐标。
然而,在ListView中,这个实现却没有这么方便。
在ListView中,setOnScrollListener(new AbsListView.OnScrollListener(),可以获得以下两个方法:
1)public void onScrollStateChanged(AbsListView view, int scrollState)
2)public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

方法1 监听着ListView的滑动状态改变。官方的有三种状态SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING、SCROLL_STATE_IDLE:

SCROLL_STATE_TOUCH_SCROLL:手指正拖着ListView滑动

SCROLL_STATE_FLING:ListView正自由滑动

SCROLL_STATE_IDLE:ListView滑动后静止

方法2 监听滑动:

firstVisibleItem:第一个可见项是ListView的第几项

visibleItemCount:可见项的总数

totalItemCount:总项数

可见,在ListView中,我们是没有获得滑动Y坐标的方法的。但是我们有firstVisibleItem,由它可以知道我们已经滑走了多少个item,然后逐一测出它们的高度就可以得知总共滑走的Y值是多少了。

  Dictionary<Integer, Integer> listViewItemHeights = new Hashtable<Integer, Integer>();       
   contentListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

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


                View c = view.getChildAt(0); //this is the first visible row
                if (c != null) {
                    int scrollY = -c.getTop();
                    listViewItemHeights.put(view.getFirstVisiblePosition(), c.getHeight());
                    for (int i = 0; i < view.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

                    }
                    Log.d("tag", "the scrollY of the listview is==========" + scrollY);
                }

            }
        });

ListView中的setOnScrollListener