判断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工程师平时解决问题的思路和技巧相关文章推荐
- Android Recyclerview或Viewpager判断是否已经到底部或者顶部(滑动冲突通用)
- Android ListView监听上下滑动(判断是否显示返回顶部按钮)
- 【Android】ListView监听上下滑动(判断是否显示返回顶部按钮)
- Android中判断listview是否滑动到顶部和底部方法
- 【Android】判断listview是否滑动到顶部
- Android-判断某个网络是否在网络列表中
- Android ListView监听上下滑动(判断是否显示返回顶部按钮)
- Android中判断listview是否滑动到顶部和底部的实现方法
- Android Recyclerview判断是否已经到底部或者顶部
- Android】ListView监听上下滑动(判断是否显示返回顶部按钮)
- 【Android】ListView监听上下滑动(判断是否显示返回顶部按钮
- android正确判断 ListView 是否滚动到顶部或者底部
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- Android 判断一个视图是否滚动到顶部
- Android 判断触摸点是否在某个view内部,解决子childView与parentView的touch事件冲突
- JS判断客户端是否是iOS或者Android
- 无序的列表&range是否支持判断
- Android中如何判断Intent是否存在
- android判断一个功能是否可用
- android 判断APP是否第一次打开