打造一个万能刷新加载控件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YanghuiNipurean/article/details/52840426

最近帮一个老总搞一个物流项目,原本想着在这个经济下滑的阶段赚点外快也还不错,结果在开发的过程中并非我开始想象的那么轻松,物流项目的业务还是比较复杂的。什么都不想多说了,先写篇博客压压惊。这次一起打造个万能刷新加载控件,其实刚接触android的时候就有这个想法了,一直都没有付诸行动,这段时间虽然比较累,但是闲暇时间还是将最初的想法实现的差不多了,可能大多数开发者和我一样,每次用列表刷新、加载的控件用的总不是那么轻松,总是需要根据自己的业务需求来改动别人写好的控件,还比如,用了别人的控件,突然又要在控件上加一个多的功能,这样就相当比较耗时间了。

原理

这里写图片描述

我的想法是这样的,最外层是一个BaseLayout extends LinearLayout,然后这个布局的大小实际是超过屏幕的,最上面是HeaderView,最底下是FooterView,顾名思义,分别是用于加载和刷新的,而屏幕部分显示的ContentView,这个就是我们列表控件,当然了,随着RecyclerView的出现,我们也就没有必要实现ListView和GridView了,这样更加方便使用。为了节约篇幅(写篇文章也不容易,深入细节也没有必要了),我们只聊聊刷新,如何判断是否要刷新呢,首先用户下拉的时候,屏幕上面的第一个Item必须是列表的第一个Item(因为列表控件都采用了复用机制),第二个条件是这个Item的最上面top是0,这个应该也很好理解,就是全暴露在屏幕中央,这样,BaseLayout就可以拦截事件,利用Scroller来逐步的显示HeaderView,直至满足刷新状态。Ok,这个很简单并不是我们的重点,当你上移BaseLayout,当HeaderView像图二阶段,你完全可以利用BaseLayout去拦截事件,那么到了第三个步骤呢?难道还是拦截,那么上移过程中FooterView肯定会暴露在屏幕中,这显然不是我们想要的,所以,我们就是用嵌套滑动机制来解决这个问题,让BaseLayout实现NestedScrollingParent,这样当上滑阶段也就是Push过程,我们在BaseLayout里面监听到ContentView的滑动过程,来实现我们的效果。用这样的布局方式,我的目的很明显,就是想把刷新和加载过程完全的解耦。并且,HeaderView 和 FooterView 以及ContentView 很轻松的替换,这样就非常的方便,利于我们平时的开发。为了验证我的想法是否可行,我从github上面随便找了一个开源库是对RecyclerView动过“手脚”的,是侧滑Item删除,然后效果还不错,等会底下我显示出效果图。

效果

1.一共有两种刷新的方式,一种是根据临界值改变状态,一种是根据下来的距离来改变RefreshView的状态(这里就用美团的效果来参考下)。


刷新风格



2.加载的方式也提供了两种风格,一种是快速下滑到底端,加载。另外一种是已经到了底端但是用户还是拖动的,就采用了之前XListView的拖动加载方式。


加载风格

3.出了加载更多的方式不同,另外提供了加载结束时,也就是数据全部加载完毕时的显示效果,也有两种方式。一种是直接底部显示一个view,没有更多数据,另外一种就类似QQ的刷新效果,提示没有更多,然后回弹回去。


load_end_oneload_end_two



4.另外还添加了Android-PullToRefresh的scroll over的效果。


这里写图片描述



5.当然,我们关心的实用价值,那么当网络错误、或者加载失败,效果该如何呢?NRecyclerView也提供了两种方式,一个是没有广告位的,另外一种是有广告位的。


stand_view_onestand_view_two


从效果图中也可以看到,不仅占位还提供了刷新功能,这是好多框架都没有的。



6.NRecyclerView还提供了加载数据时不可滑动和可滑动的方式。


这里写图片描述

7.一般的加载方式,已经提供了差不多了,那么至于RecyclerView的优势当然是LayoutManager效果,我们看看不同LayoutManager加载图片的效果如何把。


这里写图片描述

8.当然,上面都不是重点,很多第三方控件都能做到,我们NRecyclerView要做的是万能加载控件,封装了加载、刷新的功能。比如,我要在刷新、加载控件里面新增一个侧滑删除的功能,这时,必须得我们自己修改源码了,但是NRecyclerView就很容易的解决了,这里用SwipeMenuRecyclerView的控件,我也是随便在github上找的。看看效果:


这里写图片描述


最后

写一个刷新加载控件是不是,但是能写好也并非一件容易的事情,其中被bug折磨的死去活来的,可能NRecyclerView还存在一些bug,希望大家指明出来,我及时更新,后续时间多了,自然是对它拓展和做一些封装和优化。当然有人愿意和我一起维护、开发最好了,一起学习一起进步!

apk下载     项目地址

猜你喜欢

转载自blog.csdn.net/YanghuiNipurean/article/details/52840426