欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 中RecyclerView顶部刷新实现详解

程序员文章站 2023-12-16 18:24:28
android 中recyclerview顶部刷新实现详解 1. recyclerview顶部刷新的原理 recyclerview顶部刷新的实现通常都是在recycle...

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

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

上一篇:

下一篇: