0

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

    2023.06.07 | admin | 175次围观

    今日科技快讯

    近日,微信对网上沸沸扬扬白血病女孩通过赞赏获得200多万作出回应。首先微信明确规定赞赏功能是不能用于募捐的,同时平台对赞赏功能设定了单日5万的金额上限,超过额度则用户不能进行赞赏。11月29日起,当事文章阅读量快速上涨,并导致赞赏资金猛增,达到5万的上限,赞赏功能暂停。11月30日凌晨零点,赞赏功能自动重新开启,在短时间内,大量用户给公众号“罗尔”进行赞赏,由此触发系统bug,导致单日5万限制失效。最后,微信将陆续把捐款退回到赞赏人的零钱包,同时祝小朋友早日康复。

    作者简介

    本篇是 Nipuream 的第四篇投稿,他之前分析过EventBus,也分享过自定义View抽奖转盘,这次直接自己造了一个多功能列表控件,希望能帮助想了解原理或者有开发需求的朋友。最后祝大家周末愉快!

    Nipuream 的博客地址:

    最近帮一个老总搞一个物流项目,原本想着在这个经济下滑的阶段赚点外快也还不错,结果在开发的过程中并非我开始想象的那么轻松,物流项目的业务还是比较复杂的。什么都不想多说了,先写篇博客压压惊。

    这次一起打造个万能刷新加载控件,其实刚接触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的刷新效果,提示没有更多,然后回弹回去。

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

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

    从效果图中也可以看到微信里面无法加载图片,不仅占位还提供了刷新功能,这是好多框架都没有的。

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

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

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

    最后

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

    apk下载:

    项目地址:

    更多

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论