分享一段小代码canScrollList

最近在写判断ListView是否可以滚动的代码,忽然发现一个函数
“canScrollList“
它的代码是这样的

/**
* Check if the items in the list can be scrolled in a certain direction.
*
* @param direction Negative to check scrolling up, positive to check
*            scrolling down.
* @return true if the list can be scrolled in the specified direction,
*         false otherwise.
* @see #scrollListBy(int)
*/
public boolean canScrollList(int direction) {
        final int childCount = getChildCount();
        if (childCount == 0) {
            return false;
        }


        final int firstPosition = mFirstPosition;
        final Rect listPadding = mListPadding;
        if (direction > 0) {
            final int lastBottom = getChildAt(childCount - 1).getBottom();
            final int lastPosition = firstPosition + childCount;
            return lastPosition < mItemCount || lastBottom > getHeight() - listPadding.bottom;
        } else {
            final int firstTop = getChildAt(0).getTop();
            return firstPosition > 0 || firstTop < listPadding.top;
        }
    }



看到这里大家都明白了,这个代码虽然是API19才能用,但是是可以提取出来兼容到低版本的
于是,我就做了这样一个兼容的方法



    /**
     * 判断是否可以滚动的兼容函数
     * @param listView
     * @param direction 方向,大于0就是向下的方向
     * @return
     */
    public static boolean canScrollList(AbsListView listView, int direction) {
        if (Build.VERSION.SDK_INT >= 19) return listView.canScrollList(direction);
        else {
            final int childCount = listView.getChildCount();
            if (childCount == 0) {//列表中没有一个子对象的时候,当然是不能滚动啦
                return false;
            }
            final int firstPosition = listView.getFirstVisiblePosition();
            if (direction > 0) {//判断方向,大于零的就是表示判断能否往下滚动
                final int lastBottom = listView.getChildAt(childCount - 1).getBottom();
                final int lastPosition = firstPosition + childCount;
                //最右一个item的位置小宇总位数的时候可以滚动
                // 最后一个item的底部高度如果比减去padding之后的
                // listview底部还要高的那就是在屏幕外,就是可以滚动的
                return lastPosition < listView.getCount() || lastBottom > listView.getHeight() - listView.getListPaddingBottom();
            } else {
                final int firstTop = listView.getChildAt(0).getTop();
                return firstPosition > 0 || firstTop < listView.getListPaddingTop();
            }
        }
    }

注意这个东西只能在item 等高的时候判断