SuperRecyclerView,只为打造出更好用的RecyclerView
正如之前的ListView,现在RecyclerView的衍生版本也层出不穷。今天来自 一叶飘舟 的投稿正是RecyclerView的拓展,封装了主流的自定义需求,希望能对大家有所帮助。
一叶飘舟 的博客地址:http://blog.****.net/jdsjlzx
SuperRecyclerView 是支持 addHeaderView、 addFooterView、下拉刷新、分页加载数据 的RecyclerView。
它对 RecyclerView 控件进行了拓展,给RecyclerView增加 HeaderView、FooterView,并且不需要对你的Adapter做任何修改。
主要功能
下拉刷新、滑动到底部自动加载下页数据;
可以方便添加Header和Footer;
头部下拉样式可以自定义;
具备item点击和长按事件。
网络错误加载失败点击Footer重新请求数据;
可以动态为FooterView赋予不同状态(加载中、加载失败、滑到最底等)。
如果我比别人看得远些,那是因为我站在巨人们的肩上。 (牛顿)
本开源控件是基于 HeaderAndFooterRecyclerView(https://github.com/cundong/HeaderAndFooterRecyclerView) 开源项目而来,在原基础上进行了扩充。在此感谢cundong作者(github地址:https://github.com/cundong)。
RecyclerOnScrollListener实现了 onScrollUp()、onScrollDown()、onBottom()、onScrolled() 四个事件,如下所示:
onScrollUp()——RecyclerView向上滑动的监听事件;
onScrollDown()——RecyclerView向下滑动的监听事件;
onBottom()——RecyclerView滑动到底部的监听事件;
onScrollDown()——RecyclerView正在滚动的监听事件;
从上面的 RecyclerOnScrollListener类 的介绍中就可以看出,实现加载更多只要在 onBottom() 接口中处理即可。
为了达到和 Listview 的下拉刷新效果,本项目 没有借助SwipeRefreshLayout控件,而是在 自定义RecyclerView头部 实现的刷新效果。
这里的下拉刷新效果借鉴了开源库:
AVLoadingIndicatorView
https://github.com/81813780/AVLoadingIndicatorView
设置加载样式:
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
AVLoadingIndicatorView 库有多少效果,SuperRecyclerView 就支持多少下拉刷新效果,当然你也可以自定义下拉效果。
效果图:
下拉刷新逻辑处理:
mRecyclerView.setLoadingListener(new CustRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
requestData();
}
});
这里自定义了一个接口 LoadingListener,如下所示:
public interface LoadingListener {
void onRefresh();
}
下拉刷新只要在 onRefresh() 方法中处理即可。
加载数据时如果网络异常或者断网,SuperRecyclerView 为你提供了重新加载的机制。
效果图:
网络异常出错代码处理如下:
上面的 mFooterClick 就是我们点击底部的Footer时的逻辑处理事件,很显然我们还是在这里做重新请求数据操作。
在Hongyang前辈的博客中有下描述:
Click and LongClick
不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。
不过我们也可以自己去添加,只是会多了些代码而已。
实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 当然你也可以通过adapter中自己去提供回调,这里我们选择后者,前者的方式,大家有兴趣自己去实现。
Hongyang大神选择了后者,SuperRecyclerView 选择了前者。
先看下怎么使用:
原理就是监听 RecyclerView.OnItemTouchListener 事件,判断手势区别是点击还是长按。由于代码过多就不贴出来了。
如果item里面有按钮也有单独的点击事件,利用上面的方式就好出现冲突,此时不要再使用 mRecyclerView.addOnItemTouchListener 接口,这里给出另一种实现方法。
代码如下:
viewHolder.itemView是RecyclerView.Adapter中本身就具有的,不用额外定义。
源码如下:
public static abstract class ViewHolder {
public final View itemView;
int mPosition = NO_POSITION;
int mOldPosition = NO_POSITION;
long mItemId = NO_ID;
int mItemViewType = INVALID_TYPE;
int mPreLayoutPosition = NO_POSITION;
介绍完了SuperRecyclerView,似乎还少些什么,对了,那就是adapter了。
为了方便大家使用,分享个封装过的adapter。
ListBaseAdapter 使用了泛型,简单方便,消除了强制类型转换。
使用如下:
ListBaseAdapter虽然功能不强大,但是使用很方便。
SuperRecyclerView使用方便简单,无论你添加多少Header和Footer,你都不用担心position的问题,除了方便还是方便。
点击最后 阅读原文 查看源码。
如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。
欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: