Android 中RecyclerView顶部刷新实现详解
android 中recyclerview顶部刷新实现详解
1. recyclerview顶部刷新的原理
recyclerview顶部刷新的实现通常都是在recyclerview外部再包裹一层布局。在这个外层布局中,还包含一个自定义的view,作为顶部刷新时的指示view。也就是说,外层布局中包含两个child,一个顶部刷新view,一个recyclerview,顶部刷新view默认是隐藏不可见的。在外层布局中对滑动事件进行处理,当recyclerview滑动到顶部并继续下滑的时候,根据滑动的距离决定顶部刷新view的显示。当滑动距离超过某个设定的值的时候,执行顶部刷新操作。
2. recyclerview顶部刷新的实现
recyclerview顶部刷新的实现一般包含如下步骤。
- 创建自定义的布局类,它可以继承自已有的布局类,如linearlayout,也可以直接继承自viewgroup。
- 添加recyclerview和顶部刷新view作为其child。
- 重写自定义的布局类的onmeasure(),onlayout(),dispatchtouchevent(),onintercepttouchevent()等方法。
步骤3是其中最复杂的部分,需要在这些重写的方法中,完成自身和child的测量,布局和滑动事件的处理。尤其是滑动事件的处理,需要对android view的滑动机制有全面的了解才能实现。
google在19.1之后的support library v4包中增加了swiperefreshlayout类。它继承自viewgroup,在它的内部包含了一个circleimageview对象作为顶部刷新view,同时它实现了上述步骤3的全部功能。将swiperefreshlayout和recyclerview结合在一起,可以轻松的实现顶部刷新功能。
3.1 swiperefreshlayout用法
在介绍swiperefreshlayout和recyclerview结合实现顶部刷新功能之前,先介绍下swiperefreshlayout的用法。
swiperefreshlayout最重要的两个方法是:setonrefreshlistener()和setrefreshing()。
setonrefreshlistener()方法用来设置顶部刷新事件的监听,当需要执行顶部刷新时会调用此listener的onrefresh()方法,来获取最新的数据。
setrefreshing()方法用来设置顶部刷新状态。当数据获取完成后,需要调用此方法表示刷新完成。
除此之外,swiperefreshlayout还提供了一些方法用来设置顶部刷新view进度条颜色,背景色等。
3.2 swiperefreshlayout结合recyclerview实现顶部刷新
swiperefreshlayout结合recyclerview实现顶部刷新功能非常简单,只需要在swiperefreshlayout中包含一个recyclerview作为其child即可。可以直接通过xml文件来布局。
xml布局如下。
<android.support.v4.widget.swiperefreshlayout android:id="@+id/refresh_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.recyclerview android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.recyclerview> </android.support.v4.widget.swiperefreshlayout>
为了方便使用,可以对这里的布局设置通过代码进行封装,创建一个自定义的xswiperefreshlayout类来实现。代码方式实现如下。由于布局非常简单,代码中就没有引入布局文件了。
public class xswiperefreshlayout extends swiperefreshlayout { private recyclerview mrecyclerview; public xswiperefreshlayout(context context) { super(context); init(context); } public xswiperefreshlayout(context context, attributeset attrs) { super(context, attrs); init(context); } private void init(context context) { mrecyclerview = new recyclerview(context); addview(mrecyclerview); } }
3.3 操作recyclerview
对xml方式实现的顶部刷新,要操作recyclerview只需要通过findviewbyid()找到对应的recyclerview对象,然后调用相应的方法即可。
对代码方式实现的顶部刷新,需要在xswiperefreshlayout中增加操作内部recyclerview的接口。可以有两种方式:一种是在xswiperefreshlayout中增加getrecyclerview()方法,返回内部的recyclerview对象,然后在外部调用recyclerview对象的方法。另一种是xswiperefreshlayout中增加recyclerview对应的各种方法,然后透传给内部的recyclerview对象。这两种方式的示例代码如下。
public class xswiperefreshlayout extends swiperefreshlayout { private recyclerview mrecyclerview; public xswiperefreshlayout(context context) { super(context); init(context); } public xswiperefreshlayout(context context, attributeset attrs) { super(context, attrs); init(context); } private void init(context context) { mrecyclerview = new recyclerview(context); addview(mrecyclerview); } public recyclerview getrecyclerview() { return mrecyclerview; } }
public class xswiperefreshlayout extends swiperefreshlayout { private recyclerview mrecyclerview; public xswiperefreshlayout(context context) { super(context); init(context); } public xswiperefreshlayout(context context, attributeset attrs) { super(context, attrs); init(context); } private void init(context context) { mrecyclerview = new recyclerview(context); addview(mrecyclerview); } public recyclerview.adapter getadapter() { return mrecyclerview.getadapter(); } public void setadapter(recyclerview.adapter adapter) { mrecyclerview.setadapter(adapter); } public void setlayoutmanager(recyclerview.layoutmanager layout) { mrecyclerview.setlayoutmanager(layout); } // 将需要用到的每个recyclerview的方法都写在这里 ..... }
3. recyclerview同时支持顶部刷新和底部刷新
在实际的应用中,顶部刷新通常都需要和底部刷新一起使用。要让recyclerview同时支持顶部刷新和底部刷新,只需要将上述顶部刷新实现中的recyclerview换成上一篇文章中xrecyclerview即可。
xml布局如下。
<android.support.v4.widget.swiperefreshlayout android:id="@+id/refresh_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <cnx.ccpat.testapp.xrecyclerview android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"> </cnx.ccpat.testapp.xrecyclerview> </android.support.v4.widget.swiperefreshlayout>
对应的代码方式实现如下。
public class xswiperefreshlayout extends swiperefreshlayout { private xrecyclerview mrecyclerview; public xswiperefreshlayout(context context) { super(context); init(context); } public xswiperefreshlayout(context context, attributeset attrs) { super(context, attrs); init(context); } private void init(context context) { mrecyclerview = new xrecyclerview(context); addview(mrecyclerview); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
Android 中RecyclerView顶部刷新实现详解
-
Android中RecyclerView实现Item添加和删除的代码示例
-
Android自定义实现顶部粘性下拉刷新效果
-
Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能
-
Android中RecyclerView实现滑动删除与拖拽功能
-
详解Android中Handler的内部实现原理
-
Android中利用zxing实现自己的二维码扫描识别详解
-
Android中RecyclerView的item宽高问题详解
-
Android RecyclerView设置下拉刷新的实现方法
-
解析Android中实现滑动翻页之ViewFlipper的使用详解