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,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,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,attrs); init(context); } private voID init(Context context) { mRecyclerVIEw = new XRecyclerVIEw(context); addVIEw(mRecyclerVIEw); }}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android 中RecyclerView顶部刷新实现详解全部内容,希望文章能够帮你解决Android 中RecyclerView顶部刷新实现详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)