Rcv加头加尾加下拉刷新以及加载更多封装介绍(附源码)

来源:互联网 发布:剑灵马化腾捏脸数据 编辑:程序博客网 时间:2024/06/01 09:43

      我今天要介绍的这个加头加尾是从一个gitHub上面下载的,叫LRecyclerView库里面学习然后抠出来的。LRcyclerView

     我这里面抠出来的功能只是加头加尾、下拉刷新、滑动自动加载更多。其实这个LRecyclerView里面有更多的功能,包括侧滑条目,item展开、局部刷新的介绍。

    我先来介绍一下我这个demo有24个class:

    分割线1个class:DivideDecoration(这个的使用,会在我下面附的代码的activity里面有,使用起来比较简单,下面不做介绍);

    动画7个class:Indicetor、AVLoadingIndicatorView、BallPulseIndicator、BallSpinFadeLoadIndicator、LineSpinFadeLoaderIndicator、ProgressStyle、SimpleViewSwitcher(这个勉强算吧);

   头部3个class:ArrowRefreshHeader、IRefreshHeader、OnRefreshListener;

   尾部3个class:LoadingFooter、ILoadMoreFooter、OnLoadMoreListener;

   解决跟appBar的冲突1个class:AppBarStateChangeListener(如果你没有用到appBar就可以不要这个,你看一下代码就懂懂作者的意思了,所以下面不做讲解)

   数据的Item点击事件1个class:OnItemClickListener、OnItemLongClickListener(都不包括头部和尾部、只是数据源的点击事件、头部和尾部的点击事件是单独的);

  公共Adapter和ViewHolder 2个class:RcvSingleRowBaseAdapter、SuperViewHolder;

  加载数据的adapter 1个class:DataAdapter;

  核心使用2个class:CyRecyclerView、CyRecyclerViewAdapter;

  在Activity中使用 2个class: MainActivity、ItemModel(这个是数据的实体);

  下面将分别对上面的内容一个一个介绍,但是我只是介绍每个部分的基本理念和比较经典的地方概述,贴的代码不会太多,我希望看的人能下载我下面上传的代码结合着看,代码里面我也做了比较详细的注释(我自己添加的注释):

  (1)头部:我们知道一般ListView和Rcv的加载头部一般是有两种做法的,第一种做法是设施headerPadding来控制显示和隐藏;第二种是设置header的头部高度为0,然后再动态的设置头部高度,这里面用到的是第二种方法。在CyRecyclerView里面通过onTouchEvent来控制获取移动高度,然后作者非常好的将所有界面的处理都用一个接口(IRefreshHeader)来进行回调头部所有的view的变化。在松开的时候做一系列的判断来看是否需要调用刷新接口和刷新动画,并且如果你在下拉之前就已经是处于刷新状态的话,当前这次下拉完成的时候之前那个刷新还没有完毕就不执行当前这个刷新操作(不调用刷新接口、头部高度自动回到正在刷新的位置),这样就避免了不断的下拉然后不断的执行刷新操作。

  (2)尾部:这个尾部跟头部基本是类似,只不是在CyRecyclerView的OnScrollListener里面根据滑动状态来进行来判断是否执行加载更多操作,界面的修改是放在ILoadMoreFooter里面回调、调用加载更多接口是在OnLoadMoreListener里面完成的。然后在加载更多接口回调完毕之后,根据需求自己可以控制是否还放开加载更多的

功能。

  (3)动画:这里面的动画其实是用的一个AVLoadingIndicatorView来执行的,也是gitHub上面一个比较受欢迎的库。基本原理是利用反射来加载一个动画类完成动画操作。但是有些弊端:首先是只要你用了头部,那么动画其实是一直在运行的,只不过是不可见而已,其如果可以的话希望能研究一下怎么控制动画的启动和关闭,然后可见的开启,不可见的时候提前关闭动画,这样能够节约一些性能;还要一点比较总要,就是如果你在多个地方使用到了这个动画的话,就意味着你在多个地方使用到反射。其实在开发中你的app的刷新和加载更多动画都是事先定下来的(或者是后面定下来的),那么你只需要这几个特定的动画,那么你可以没必要在项目中放很多动画类,只需要放你需要的一两个动画类就可以了;第三点是动画是反射加载的,其实可以用“缓存”进行加载,然后多个地方调用的时候直接在调用之前已经初始化过的动画就可以了,不需要再去反射调用这个动画。当前写这个动画的人是很牛逼的,这点是毋容置疑的,感兴趣的可以去看看:AVLoadingIndicatorView

  (4)公共的adapter和ViewHolder:我们在用ListView的时候相信很多人就已经自己抽取过功能的Adapter,这个也是一样的,设置数据的泛型来调用adapter的方法,然后Rcv复用的时候需要继承ViewHolder,也可以做成通用的ViewHolder,然后如果你要传入数据到adapter进行使用,只需要继承adapter,传入item的布局在继承的方法里面讲data 设置到View上面就可以了,这一点跟一般的抽取都大同小异。

 (5)条目点击事件:条目点击事件分为数据源的item和头部、尾部。这个头部和尾部是自己在activity里面使用的时候自己传入的头部和尾部,会显示在刷新区域的下面和数据item的上面(不知道我的描述你懂不懂,,,感觉这里我的描述有问题。。),你在activity添加在时候,会有一个队布局进行inflate得到一个view,直接对这个view设置点击事件,就是对头部进行点击事件了。尾部也是这么回事(但是我没测,感觉应该是这样。。)。然后数据源的item的点击事件,里面回调的position就是你传进去的数据集合的position,这一点你自己看一下就懂了。


  另外这个demo适用于是竖向的需求,横向的暂时我没有写demo,不过你可以看LRececlerView,我记里面有。

  

  我添加的代码里面是有很多的注释的,还是比较良心的。。。不过我写demo是不分包的。。。请谅解。我后面再研究一下AVLoadingIndicatorView和LRecyclerView再写相关的blog。源代码

阅读全文
0 0
原创粉丝点击