SwipeRefreshLayout和RecyclerView类
1 SwipeRefreshLayout和RecyclerView之间的关系
内容栏上下滚动是RecyclerView控制的,只有当内容栏滑动到最顶上时,再也拉不动了的时候,这个时候将动作交给SwipeRefreshLayout执行刷新操作。
也就是说,滚动事件是RecyclerView的事件,由RecyclerView的listener负责处理,只有当RecyclerView往下滚动不了了的时候才交给SwipeRefreshLayout去处理。
2 关于SwipeRefreshLayout
这是一个特殊的ViewGroup,它只能有一个孩子,并且这个孩子必须是实现ScrollingView的。
一旦用户在屏幕上上下滑动或者左右滑动就会触发OnRefreshListener。
SwipeRefreshLayout是一个widget,因此它有自己的显示,即那个转圈。并且
3 关于RecyclerView
RecyclerView实现了ScrollingView,它用于大量数据的滑动列表的显示。
4 它们都是ViewGroup
因为它们都是ViewGroup,因此它们是不会有显示的。
5 下拉刷新的圈
将一个RecyclerView作为SwipeRefreshLayout的孩子即可,在转圈的时候,不会影响RecyclerView的显示。RecyclerView中显示的数据,让它的adapter提供就可以了。
这个圈可以自己设置的吗?
setColorSchemeResources,设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。
5 上拉加载更多的“更多加载中”
上拉加载更多的“更多加载中”需要自己实现。
6 下拉刷新的使用
第一,设置布局
SwipeRefreshLayout只能有一个孩子,比如包裹一个ListView;
第二,在代码中使用SwipeRefreshLayout
// 设置颜色属性的时候一定要注意是引用了资源文件还是直接设置16进制的颜色,因为都是int值容易搞混
// 设置下拉进度的背景颜色,默认就是白色的
swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white);
// 设置下拉进度的主题颜色
swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
// 下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法
swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 开始刷新,设置当前为刷新状态
//swipeRefreshLayout.setRefreshing(true);
// 这里是主线程
// 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行
// TODO 获取数据
final Random random = new Random();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mList.add(0, "我是天才" + random.nextInt(100) + "号");
mAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "刷新了一条数据", Toast.LENGTH_SHORT).show();
// 加载完数据设置为不刷新状态,将下拉进度收起来
swipeRefreshView.setRefreshing(false);
}
}, 1200);
// System.out.println(Thread.currentThread().getName());
// 这个不能写在外边,不然会直接收起来
//swipeRefreshLayout.setRefreshing(false);
}
});
adapter的数据更新之后,调用mAdapter.notifyDataSetChanged();,迫使RecyclerView更新每个items的内容。
7 自己实现上拉加载更多
第一,监听当前的ListView已经加载完了,然后就触发ListView的addFooterView来显示“更多加载中”,并且加载更多的数据,这个地方涉及到ListView的Adapter。
然后更多的数据加载了,并且显示在ListView的后面了;
第二,还需要父View的SwipeRefreshLayout的配合,因为上拉事件是它的。
8 SwipeRefreshLayout的setRefreshing(boolean refreshing)方法
这个接口触发和关闭刷新进度圈的显示,当refreshing为true的时候,刷新进度圈显示,当refreshing为false的时候,刷新进度圈停止显示。
实现首次进入自动刷新,
方法一:
①在onWindowFocusChanged()方法中,设置为刷新状态为true
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mSwipeRefreshLayout.setRefreshing(true);
}
②在获取数据完成后设置刷新状态为false
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
方法二:
①调用mSwipeRefreshLayout.measure()方法后,设置刷新状态为true
//手动调用,通知系统去测量
mSwipeRefreshLayout.measure(0,0);
mSwipeRefreshLayout.setRefreshing(true);
②在获取数据完成后设置刷新状态为false
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
在SwipeRefreshLayout绘制完成之后,再设置刷新状态为true,否则大多数情况下,SwipeRefreshLayout刷新球会不显示。
参考资料:
1 https://www.jianshu.com/p/d23b42b6360b
SwipeRefreshLayout和RecyclerView类的更多相关文章
- SwipeRefreshLayout和RecyclerView滑动冲突的解决
做了个项目,用了support包里的SwipeRefreshLayout和RecyclerView.两者一起使用有一点点小问题,有时候拉着拉着,列表还没拉玩就出来刷新的图标了,在华为荣耀上尤为明显. ...
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉载入很多其它
一.概述 本篇博客介绍的是怎样使用SwipeRefreshLayout和RecyclerView实现高仿简书Android端的下拉刷新和上拉载入很多其它的效果. 依据效果图能够发现,本案例实现了例如以 ...
- SwipeRefreshLayout 和RecyclerView 使用
使用是布局 <android.support.v4.widget.SwipeRefreshLayout android:id="@id/id_swiperefreshlayout&qu ...
- Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理
RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...
- RecyclerView再封装
RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...
- scrollview嵌套下拉控件嵌套recyclerview(不动第三方原基础自定义)
相信会碰到很多类似的需求,一个列表控件,然后控件上方的一个头部需要自定义,这样就不好有时候也不能加在列表控件的头部了,那必须得嵌套一层scrollview了,没毛病,那么一般的列表控件都是有上拉下拉的 ...
- RecyclerView下拉刷新上拉加载更多
现在Android里都建议用RecyclerView代替ListView和GridView,所以下拉刷新和上拉加载更多也需要实现.下拉刷新可以用SwipeRefreshLayout 包裹Recycle ...
- 使用Android SwipeRefreshLayout了解Android的嵌套滑动机制
SwipeRefreshLayout 是在Android Support Library, revision 19.1.0加入到support v4库中的一个下拉刷新控件,关于android的下拉刷新 ...
随机推荐
- shred命令
不做陈冠希必备.... shred --help 用法:shred [选项]... 文件... Overwrite the specified FILE(s) repeatedly, in order ...
- ansj分词器使用记录
//最简单实例 String ruiec = “分词测试123456100名”; //剔除指定的分词 s.insertStopWords("100名"); //剔除标点符号(w) ...
- Spring 跨重定向请求传递数据
在处理完POST请求后, 通常来讲一个最佳实践就是执行一下重定向.除了其他的一些因素外,这样做能够防止用户点击浏览器的刷新按钮或后退箭头时,客户端重新执行危险的POST请求. 在控制器方法返回的视图名 ...
- JAVA笔记15-线程同步
一.概念 1.多个线程之间访问同一资源,进行协调的过程是线程同步.例如两个人同时操作同一银行账户.解决方法:加锁 2.Java种引入对象互斥锁的概念,保证共享数据操作的完整性.每个对象都对应于一个可称 ...
- tf.concat( )和tf.stack( )
相同点:都是组合重构数据. 不同点:concat()不改变维数,而stack改变了维数(待定!!!) tf.concat是连接两个矩阵的操作,请注意API版本更改问题,相应参数也发生改变,具体查看AP ...
- 用户输入和while 循环
input 工作原理 函数input()让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中. message = input("need to input ...
- 目标检测:AlexNet
AlexNet是2012年ImageNet竞赛冠军. 它是在CNN的基础上设计的,CNN(卷积神经网络)可谓是现在深度学习领域中大红大紫的网络框架,尤其在计算机视觉领域更是一枝独秀.CNN从90年代的 ...
- https: could not reliably determine the server's fully qualified domain name, using localhost.localdomain.
1. 用记事本打开 将里面的 #ServerName localhost:80 注释去掉即可. 再执行 然后可以通过浏览器访问 http://localhost:80 ,如果页面显示 “It work ...
- xwiki安装部署
环境介绍 http://aiushtha-mybook.stor.sinaapp.com/xwiki/xwiki%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9 ...
- 源码阅读-Kingfisher
最后更新:2018-01-16 使用教程: 官方的链接 使用 Kingfisher 处理网络图片的读取与缓存 1. 开始使用 桥接 KingFisher, 利用 KingfisherCompatibl ...