十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先讲一下实现原理。这里我们将采取的方案是使用组合View的方式,先自定义一个布局继承自LinearLayout,然后在这个布局中加入下拉头和ListView这两个子元素,并让这两个子元素纵向排列。初始化的时候,让下拉头向上偏移出屏幕,这样我们看到的就只有ListView了。然后对ListView的touch事件进行监听,如果当前ListView已经滚动到顶部并且手指还在向下拉的话,那就将下拉头显示出来,松手后进行刷新操作,并将下拉头隐藏。
成都创新互联公司主营金沙网站建设的网络公司,主营网站建设方案,重庆APP开发公司,金沙h5小程序定制开发搭建,金沙网站营销推广欢迎金沙等地区企业咨询
下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他库。而到现在已经有了更多的选择,github上还是有很多体验不错的下拉刷新。
而下拉刷新主要有两种实现方式:
1.
在ListView中添加header和footer,监听ListView的滑动事件,动态设置header/footer的高度,但是这种方式只适用于ListView,RecyclerView。
2.
第二种方式则是继承ViewGroup或其子类,监听事件,通过scroll或Layout的方式移动child。如图(又分两种情况)
Layout时将header放到屏幕外面,target则填充满屏幕。这个也是SwipeRefreshLayout的实现原理(第二种,只下拉header)
这两种(指的是继承ListView或继承ViewGroup)下拉刷新的实现方式主要有以下区别
继承ListView/RecyclerView
继承ViewGroup或其子类
适用范围
ListView/Recycler
理论支持所有View和ViewGroup
加载更多
实现简单,体验好
可以实现,看需求了,做不出ListView那种加载效果的,体验比较一般
多点触控
可以完美支持
header下拉状态中是完美支持的,但是回去之后,很难将多点触控事件传递给child
案例
QQ好友列表
美团、京东等
而今天,我打算先讲第二种方式实现方式,继承ViewGroup,代码可以直接参考SwipeRefreshLayout,或者pullToRefresh,或者ultra-pull-to-refresh
一、思考和需求
下拉刷新需要几个状态:Reset–
Pull
–
Refreshing
–
Completed
–Reset
为了应对各式各样的下拉刷新设计,我们应该提供设置自定义的Header,开发者可以通过实现接口从而自定义自己的header。
而且header可以有两种显示方式,一种是只下拉header,另外一种则是header和target一起下拉。
二、着手实现代码
【1】Header
Header通常有下拉箭头,文字,进度条等元素,根据下拉的距离来改变它的状态,从而显示不同的样式
【2】Content
这部分是内容区域,网上有很多例子都是直接在ListView里面添加Header,但这就有局限性,因为好多情况下并不一定是用ListView来显示数据。把要显示内容的View放置在一个容器中,如果想实现一个用ListView显示数据的下拉刷新,需要创建一个ListView旋转到容器中。处理这个容器的事件(down,move,up),如果向下拉,则把整个布局向下滑动,从而把header显示出来。
【3】Footer
Footer可以用来显示向上拉的箭头,自动加载更多的进度条等。
这是两个分开的部分。如果你是新手,先一个一个来。
我只能跟你说一下思路,具体的东西你在网上查查,不行再问我,新手的话慢慢来。
1.
下拉刷新,获取listview的下拉时间显示header,然后调用更新数据的接口就可以了。
2.
上啦加载,是分页获取数据,获取listview的是否拉到最底,如果拉倒最底,获取数据,让后list的数据添加获取的数据,更新adapter就可以了。
这个就需要你判断下拉的位置了,需要用到事件流的分发,oninterrupttouchevent(),具体的名字记不住了,你打一下就会出来,如果位置是从最上方开始的,把这个下拉时间分给下拉刷新处理,如果不是,就给webview处理。思想就是这个思想,代码自己写。记得更清楚。