Android 中RecyclerView顶部刷新实现详解

Android 中RecyclerView顶部刷新实现详解,第1张

概述Android中RecyclerView顶部刷新实现详解1.RecyclerView顶部刷新的原理RecyclerView顶部刷新的实现通常都是在RecyclerView外部再包裹一层布局。在这个外层布局中,还包含一个自定义的View,作为顶部刷新时的指示Vie

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顶部刷新实现详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存