RecyclerView:下拉刷新和上拉加载更多
RecyclerView实现的列表,默认情况下面是不带下拉刷新和上拉记载更多效果的,但在实际项目中,经常需要添加这两项功能,而现成的库也有很多,但我们经常只需要最基本的下拉刷新和上拉加载更多功能,而不需要其他多余功能。所以,自己动手来实现:
- 下拉刷新:用 SwipeRefreshLayout 包裹 RecyclerView 控件,同时通过实现接口 SwipeRefreshLayout.OnRefreshListener实现,注意:这个下拉刷新具有通用性,不只是RecyclerView
- 上拉加载更多:通过 LinearLayoutManager 来获取RecyclerView是否滑动到底部来实现
RecyclerView+SwipeRefreshLayout 实现下拉刷新
SwipeRefreshLayout 介绍
SwipeRefreshLayout字面意思就是下拉刷新的布局,继承自ViewGroup,在support v4兼容包下。基本用法:
- setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器
- setRefreshing(boolean):显示或者隐藏刷新进度条
- isRefreshing():检查是否处于刷新状态
- setColorSchemeResources():设置进度条的颜色主题,最多设置四种,以前的setColorScheme()方法已经弃用了
实现过程
1.SwipeRefreshLayout本身自带下拉刷新的效果,那么我们可以选择在RecyclerView布局外部嵌套一层SwipeRefreshLayout布局即可
2.在Activity中获取SwipeRefreshLayout控件并且设置OnRefreshListener监听器,同时实现里边的onRefresh()方法,在该方法中进行网络请求最新数据,然后刷新RecyclerView列表同时设置SwipeRefreshLayout的进度Bar的隐藏或者显示效果
RecyclerView 设置滚动事件加入上拉加载更多功能
上拉加载,主要实现的是一个类似分页的功能,不能一开始的时候就加载全部数据,如果数据很多,或者是网络速度慢的话,这需要很久的时间才能加载完成。
LayoutManger给我们提供了以下几个方法来让开发者方便的获取到屏幕上面的顶部item和顶部item相关的信息:
- findFirstVisibleItemPosition()
- findFirstCompletlyVisibleItemPosition()
- findLastVisibleItemPosition()
- findLastCompletlyVisibleItemPosition()
同时通过Recycler.Adapter的getItemCount()方法可以轻松获取到RecyclerView列表中Item View的个数。
RecyclerView 有一个方法 **addOnScrollListener **,我们只要传入一个 **RecyclerView.OnScrollListener **就可以实现加载更多了,但是事实是为了充分保证 RecyclerView 的灵活性,Android 本身是没有对这个滑动接口做处理的,需要我们自定义个加载更多的接口去实现它,然后才能真正实现加载更多。实现起来也很简单,我们只要重写 **onScrolled **方法即可。
可以看到,虽然这个方法能够实现我们的需求,但是AS自动将这个函数划掉了,代表这个方法已经不被推荐了,所以,我又改为以下方法来实现:
这个方法与上面的方法看起来似乎一模一样,只是一个是setOnScrollListener,一个是addOnScrollListener。但Android推荐后者,因为从名字也可以看出,前者出现时间较早,只是直接将这个接口进行设置,后者出现较晚,是将接口添加给了控件,允许同时添加多个。
给RecyclerView 添加上拉加载展示布局(多布局显示)
上面虽然实现了上拉加载更多的逻辑功能,但是展示性不强,界面没有明显的变化,我们需要让用户知道确实实现了上拉加载。那么,可以在RecyclerView底部加一个进度或者提示布局。RecyclerView支持多布局显示:
1.添加要加入的布局
文件
2.加入布局状态标识,用来判断布局类型
3.重写getItemCount()方法,返回的Item数量在数据的基础上面加添加的布局项
4.重写getItemViewType方法来判断返回加载的布局的类型
5.在onCreateViewHolder(ViewGroup parent,int viewType)加载布局的时候根据viewType的类型来选择指定的布局创建,返回即可:
(这个截图是后期加的,因为项目有所改动,显示代码内容可能与上文有所不对应,重要的是理解思路即可)
6. 在判断数据的时候(onBindViewHolder),判断holder的类型来进行判定数据即可(使用instanceof)
参考资料
RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
给RecyclerView最纯粹的下拉刷新和上拉加载更多