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刷新球会不显示。

参考资料:

https://www.jianshu.com/p/d23b42b6360b

SwipeRefreshLayout和RecyclerView类的更多相关文章

  1. SwipeRefreshLayout和RecyclerView滑动冲突的解决

    做了个项目,用了support包里的SwipeRefreshLayout和RecyclerView.两者一起使用有一点点小问题,有时候拉着拉着,列表还没拉玩就出来刷新的图标了,在华为荣耀上尤为明显. ...

  2. 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉载入很多其它

    一.概述 本篇博客介绍的是怎样使用SwipeRefreshLayout和RecyclerView实现高仿简书Android端的下拉刷新和上拉载入很多其它的效果. 依据效果图能够发现,本案例实现了例如以 ...

  3. SwipeRefreshLayout 和RecyclerView 使用

    使用是布局 <android.support.v4.widget.SwipeRefreshLayout android:id="@id/id_swiperefreshlayout&qu ...

  4. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  5. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  6. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

  7. scrollview嵌套下拉控件嵌套recyclerview(不动第三方原基础自定义)

    相信会碰到很多类似的需求,一个列表控件,然后控件上方的一个头部需要自定义,这样就不好有时候也不能加在列表控件的头部了,那必须得嵌套一层scrollview了,没毛病,那么一般的列表控件都是有上拉下拉的 ...

  8. RecyclerView下拉刷新上拉加载更多

    现在Android里都建议用RecyclerView代替ListView和GridView,所以下拉刷新和上拉加载更多也需要实现.下拉刷新可以用SwipeRefreshLayout 包裹Recycle ...

  9. 使用Android SwipeRefreshLayout了解Android的嵌套滑动机制

    SwipeRefreshLayout 是在Android Support Library, revision 19.1.0加入到support v4库中的一个下拉刷新控件,关于android的下拉刷新 ...

随机推荐

  1. shell练习--PAT题目1004: 成绩排名 !(失败案例,shell运行超时)

    读入 n(>)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第 1 个学生的姓 ...

  2. 牛客挑战赛34 A~E

    闷声发大财 A O(nmk)dp即可,因为带了1/2的常数+2s所以很稳 #include <algorithm> #include <iostream> #include & ...

  3. Mysql包的下载

    官方下载地址: https://dev.mysql.com/downloads/mysql/5.5.html#downloads mysql的下载界面 二进制的包 通用的RPM包 源码包

  4. 奇怪的 Markdown / LaTeX 笔记

    记一下日常见到的一些奇怪的 Markdown / LaTeX 用法... Markdown LaTeX LaTeX 数学 1. 运算符 1.1 造运算符: a \operatorname{sin} c ...

  5. UVa 1343 The Rotation Game (状态空间搜索 && IDA*)

    题意:有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面. 求:使 ...

  6. UI编辑

    UI编辑 基本部件介绍 (1)Layout(布局) (2)Space(空间) (3)Button (4)ItemView (5)ItemWidget Widget继承自View,即ListWidget ...

  7. (54)LINUX应用编程和网络编程之九Linux网络通信实践

    3.9.1.linux网络编程框架 3.9.1.1.网络是分层的 (1)OSI 7层模型(理论指导) (2)网络为什么要分层 (3)网络分层的具体表现 3.9.1.2.TCP/IP协议引入(网络分层实 ...

  8. [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)

    题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...

  9. 题目1.A乘以B

    看我没骗你吧 —— 这是一道你可以在10秒内完成的题:给定两个绝对值不超过100的整数A和B,输出A乘以B的值. 1实验代码 #include<stdio.h>int main(void) ...

  10. [ git ] eclipse如何与git 配合工作。

    原文链接http://blog.csdn.NET/yangzhihello/article/details/11003941 呵呵,看看这个吧.先去安装eclipse.然后在现在 egit,应该可以从 ...