您的位置:首页 > 移动开发 > Android开发

判断android中列表是否在顶部

2016-08-23 19:28 369 查看

前言

需求来自需要定制一个通用的下拉刷新的控件,但是不可避免的需要知道如果列表还可不可以上滑,所以自然而然的想到的了系统的一个下拉刷新的控件! 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工程师平时解决问题的思路和技巧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: