我们的日常开发中经常用到下拉刷新,而网上评价最好的开源下拉刷新组件当然还是android-Ultra-Pull-To-Refresh 此组件可以给任何的控件添加下拉刷新功能。当然也包括recycleview了。

可惜android-Ultra-Pull-To-Refresh只是提供了下拉刷新的功能,但是对于列表类的组件,我们日常开发中更多的会用到其上拉加载或者滑到底部自动加载的功能,当然目前来看用户更喜欢滑到底部自动加载的功能。就比如今天说的recycleview我们只能自己给其添加滑到底部加载更多的功能了。
那它的实现原理是神马呢 非常简单:
RecycleView内部有一个滑动监听的抽象类OnScrollListener来接收滚动事件,此类里面有两个实现的方法
public abstract static class OnScrollListener {
/**
* Callback method to be invoked when RecyclerView's scroll state changes.
*
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
public void onScrollStateChanged(RecyclerView recyclerView, int newState){}
/**
* Callback method to be invoked when the RecyclerView has been scrolled. This will be
* called after the scroll has completed.
* <p>
* This callback will also be called if visible item range changes after a layout
* calculation. In that case, dx and dy will be 0.
*
* @param recyclerView The RecyclerView which scrolled.
* @param dx The amount of horizontal scroll.
* @param dy The amount of vertical scroll.
*/
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
}
通多源码的注释可以了解到
onScrollStateChanged 当recyclerview的滚动状态发生变化的时候调用。
onScrolled 在布局可见和recycleview滚动的时候调用。
那么思路就是:
(1)在onScrollStateChanged 方法中判断当前的滚动状态是停止滚动的状态。
(2)然后根据api中的方法获得最后可见的位置。
(3)判断当前可见的recycleview中item的条数大于0
(4)判断最后可见的位置大于数大于item总数减一
(5)并且item的总数大于可见的item 这样可以保证超过一个界面的时候才执行。
当满足让面的要求的时候我们就可以通过接口回调执行我们的耗时逻辑 ,并显示出加载的dialog。
因为RecyclerView可以通过layoutManager灵活的转换成列表,表格,和瀑布流。尤其是瀑布流的时候,它的最后可见的位置是不一样的,所以我们必须根据其不同的layoutManager状态获取相对应的最后可见位置。
代码:
@Override
public void onScrollStateChanged(int state) {
if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null) {
LayoutManager layoutManager = getLayoutManager();
int lastVisibleItemPosition;
if (layoutManager instanceof GridLayoutManager) {
lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into);
lastVisibleItemPosition = findMax(into);
} else {
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
}
if (layoutManager.getChildCount() > 0
&& lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount()) {
View footView = mFootViews.get(0);
footView.setVisibility(View.VISIBLE);
mLoadingListener.onLoadMore();
}
}
}
我们可以通过api获取瀑布流的所有的列 ,通过下面的方法找出最下面的一列。将加载的dialog显示在此列的下面。
private int findMax(int[] lastPositions) {
int max = lastPositions[0];
for (int value : lastPositions) {
if (value > max) {
max = value;
}
}
return max;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# recycleview滑动监听
# RecycleView监听滑动到底部
# recycleview
# 设置监听
# Android ExpandableListView实现下拉刷新和加载更多效果
# Android实践之带加载效果的下拉刷新上拉加载更多
# android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多
# Android中使用ScrollView实现滑动到底部显示加载更多
# Android RecyclerView添加上拉加载更多效果
# Android中RecycleView与ViewPager冲突的解决方法及原理
# Android RecycleView使用(CheckBox全选、反选、单选)
# Android 使用RecycleView列表实现加载更多的示例代码
# 加载
# 滑到
# 神马
# 自动加载
# 最好的
# 尤其是
# 在此
# 我们可以
# 可以通过
# 此类
# 我们必须
# 转换成
# 回调
# 开源
# 相对应
# 就比
# 其上
# 大家多多
# 就可以
# 条数
相关文章:
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何通过VPS搭建网站快速盈利?
网站制作说明怎么写,简述网页设计的流程并说明原因?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
,巨量百应是干嘛的?
如何快速搭建FTP站点实现文件共享?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何正确选择百度移动适配建站域名?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何通过万网虚拟主机快速搭建网站?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
建站之星各版本价格是多少?
如何选购建站域名与空间?自助平台全解析
建站之星如何助力网站排名飙升?揭秘高效技巧
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
一键网站制作软件,义乌购一件代发流程?
宝塔Windows建站如何避免显示默认IIS页面?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
开源网站制作软件,开源网站什么意思?
建站主机选哪种环境更利于SEO优化?
家具网站制作软件,家具厂怎么跑业务?
如何在云虚拟主机上快速搭建个人网站?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
上海网站制作开发公司,上海买房比较好的网站有哪些?
Android使用GridView实现日历的简单功能
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
行程制作网站有哪些,第三方机票电子行程单怎么开?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何在宝塔面板创建新站点?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
网站制作免费,什么网站能看正片电影?
如何快速搭建高效WAP手机网站吸引移动用户?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
建站之星在线客服如何快速接入解答?
实例解析angularjs的filter过滤器
如何在Golang中指定模块版本_使用go.mod控制版本号
如何通过宝塔面板实现本地网站访问?
Swift开发中switch语句值绑定模式
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
如何通过VPS建站实现广告与增值服务盈利?
网站制作公司,橙子建站是合法的吗?
建站主机无法访问?如何排查域名与服务器问题
*请认真填写需求信息,我们会在24小时内与您取得联系。