Material Design 风格的下拉刷新


上图为 Material Design 风格的下拉刷新,最早在 Inbox 中看到,觉得比起 holo 风格中的下拉刷新,更加适合 Material Design,十分喜欢。之后又再其他 App 中看到,只不过有时颜色有所不同而已,因此判断这样的下拉刷新应该存在一个写好的控件,只需要在布局文件中加入,在 Activity 或 Fragment 中设置监听器应该就能使用。于是开始搜索,系统能加到自己的项目中,经过搜索发现 Google 提供的 Sample 中就有相关内容,但导入后发现似乎并没有那么简单,还自定义了一个控件,当时项目比较急就暂时放弃了。

过了一段时间,终于有时间静下来好好了解下这个控件了,这次不懂是不是搜索的关键字和上次不同,搜索到了一个个人博客中的一篇文章,标题就和本文一样介绍了 SwipeRefreshLayout,让我了解到了 Material Design 风格的下拉刷新果然就如我想象中那么简单,而之前查到的Sample是示范如何在复数子布局的布局种使用这个下拉刷新。

这篇文章正是我开始写技术博客的契机,因此我也打算按自己的理解介绍一下 SwipeRefreshLayout。

SwipeRefreshLayout 存在于V4支持包中,因此要使用 SwipeRefreshLayout 首先需要引入这个包:

compile 'com.android.support:support-v4:22.1.1'

接下来在布局文件中使用 SwipeRefreshLayout 包裹住需要出现下拉刷新的地方:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    ...
</android.support.v4.widget.SwipeRefreshLayout>

此处需要注意的是被 SwipeRefreshLayout 包裹的内容需要是可滚动的,比如 ListView 等,若不是需要在其外层包裹一个 ScrollView,否则下拉刷新时刷新动画的显示会有问题,Google 提供的 Sample 中显示无数据的 TextView 上就出现了这个问题,具体原因还得阅读 SwipeRefreshLayout 的源码才能够知道。

此时在该界面下拉已经可以出现下拉刷新的动画了,但什么都不会做,需要添加刷新的监听器:

mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // 执行刷新操作
            }
        });

之后只需要在刷新操作完成的时候取消刷新动画的显示即可:

mSwipeRefreshLayout.setRefreshing(false);

至此下拉刷新的功能就完成了。除此之外 SwipeRefreshLayout 还有两个经常会用到的方法setColorSchemeColors(int... colors)setEnabled(boolean enabled),前者通过传入颜色的资源ID,决定下拉刷新动画中箭头的颜色,传入多个颜色时剪头则会顺序变化,后者可在需要禁止下拉刷新功能时传入 false。