判断android中列表是否在顶部

来源:互联网 发布:小额贷款那个软件最好 编辑:程序博客网 时间:2024/06/05 10:59

前言

需求来自需要定制一个通用的下拉刷新的控件,但是不可避免的需要知道如果列表还可不可以上滑,所以自然而然的想到的了系统的一个下拉刷新的控件! SwipeRefreshLayout,对,就是这个控件,如果还没有用过的人可以去搜索使用一下,是一个十分方便的控件,但是如果公司要定制的效果那就没办法了,所以要向楼主一样需要自定义个。那么废话也不多说了,就直接教大家如何知道任何情况下一个控件是否还可以向上滚动!


首先我们知道事件机制是一锤子的买卖,所以SwipeRefreshLayout作为一个下拉刷新的控件,它肯定是在onInterceptTouchEvent中进行判断是否拦截事件的,那么我们就去找到相应的代码!

    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        ensureTarget();        final int action = MotionEventCompat.getActionMasked(ev);        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {            mReturningToStart = false;        }        if (!isEnabled() || mReturningToStart || canChildScrollUp()                || mRefreshing || mNestedScrollInProgress) {            // Fail fast if we're not in a state where a swipe is possible            return false;        }        //.........以下省略    }

我省略了很多代码,但是这段是没有省略的,我们可以很清楚的看到有一个方法canChildScrollUp(),所以那还用说嘛,直接点进去啊

    /**     * @return Whether it is possible for the child view of this layout to     *         scroll up. Override this if the child view is a custom view.     */    public boolean canChildScrollUp() {        if (android.os.Build.VERSION.SDK_INT < 14) {            if (mTarget instanceof AbsListView) {                final AbsListView absListView = (AbsListView) mTarget;                return absListView.getChildCount() > 0                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)                                .getTop() < absListView.getPaddingTop());            } else {                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;            }        } else {            return ViewCompat.canScrollVertically(mTarget, -1);        }    }

于是乎发现了这段源代码,我就开心的笑了,这里注释比较简单,这个方法就是我们想要的代码,android实现了!

但是里面使用一个成员变量mTarget,不用考虑也知道这个就是他需要判断的控件,那么我们为了代码的通用性,博主肯定把它拿出来改改呀!

    /**     * 判断这个View是不是可以向上滑动     *     * @param mTarget     * @return     */    public boolean canChildScrollUp(View mTarget) {        if (android.os.Build.VERSION.SDK_INT < 14) {            if (mTarget instanceof AbsListView) {                final AbsListView absListView = (AbsListView) mTarget;                return absListView.getChildCount() > 0                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)                        .getTop() < absListView.getPaddingTop());            } else {                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;            }        } else {            return ViewCompat.canScrollVertically(mTarget, -1);        }    }

一不小心就改造成了通用代码啦,妈妈再也不用担心如何判断列表类的控件是否还可以向上滚动啦!

总结

有时候需要多看看系统源码,不仅有利于自身水平的提高,还可以发现很多android工程师平时解决问题的思路和技巧

2 0
原创粉丝点击