上拉加载

下拉刷新、上拉加载更多控件实现原理及解析(一)

笑着哭i 提交于 2019-12-09 23:03:06
以前那个账号,以后可能不用了,把文章搬过来!!! 效果预览 接受 hi大头鬼hi 的建议,来一个动态图,方便大家知道这是个什么东西。 动机 项目中,需要一个支持任意View的下拉刷新+上拉加载控件,GitHub上有很多现成的实现,如 Android-PullToRefresh , android-Ultra-Pull-To-Refresh 等,这些Library都非常优秀,但是 Android-PullToRefresh 已经不在维护了, android-Ultra-Pull-To-Refresh 本身并不支持上拉加载更多,经过一番纠结后决定自己写一个。 原理 无论是下拉刷新还是上拉加载更多,原理都是在内容View(ListView、RecyclerView...)不能下拉或者上划时响应用户的触摸事件,在顶部或者底部显示一个刷新视图,在程序刷新操作完成后再隐藏掉。 实现 既然要在头部和顶部添加刷新视图,我们的控件应该是个ViewGroup,我是直接继承FrameLayout,这个控件的名字叫 NsRefreshLayout 。然后我们需要定义一些属性,如是否自动触发上拉加载更多、刷新视图中的文字颜色等。 属性定义 <declare-styleable name="NsRefreshLayout"> <!--Loading视图背景颜色--> <attr name="load_view

下拉刷新、上拉加载更多控件实现原理及解析(二)

荒凉一梦 提交于 2019-12-09 12:50:27
之前的博客 《下拉刷新、上拉加载更多控件实现原理及解析》 中实现了一个通用的刷新控件,但是使用中发现了问题,当包含的列表中有嵌套滚动(滚动控件中还包含滚动控件)时,会出现滚动冲突。 原因分析 因为我们直接拦截了“dispatchTouchEvent”,这个回调是不能被子控件控制的,所以当子控件需要父控件让出Touch事件时(比如调用父控件的“requestDisallowInterceptTouchEvent(true)”方法),我们现在的实现是达不到的,我们需要换一个回调接口,去实现我们的功能。 寻找合适的函数 我们现在有两个需求: 1、能够拦截Touch事件; 能够拦截Touch事件的函数,除了我们前面用到的“dispatchTouchEvent”,还有就是“onInterceptTouchEvent”,这个函数是需要和“onTouchEvent”配合使用的。 “onInterceptTouchEvent”拦截触摸事件的意思,只要你在该函数中一直返回false(ViewGroup的默认实现是返回false的),后续的Touch事件会一直先给这个函数;一旦你在该函数中返回true,那该函数就再也收不到后续的Touch事件,而是传给它的“onTouchEvent”函数,“onTouchEvent”返回false表示不消耗Touch事件,返回true则消耗Touch事件。 2