当前位置: 移动技术网 > IT编程>移动开发>Android > Android 中RecyclerView顶部刷新实现详解

Android 中RecyclerView顶部刷新实现详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

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);
  }
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网