谷歌为了让Android的下拉刷新风格能有一个统一的标准,于是在Material Design中制定了一个官方的设计规范。当然我们不需要去深入了解这个规范到底是什么样的,因为谷歌早就提供好了现成的控件,我们在项目中直接使用就行了。
效果图:
SwipeRefreshLayout就是用于实现下拉刷新功能的核心类,它是由support-v4库提供的。我们把想要实现的下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以迅速让这个控件支持下拉刷新。
修改activity_main.xml中的代码,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.DrawerLayout
...
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.design.widget.FloatingActionButton
.../>
</android.support.design.widget.CoordinatorLayout>
...
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
可以看到在RecyclerView的外面又嵌套了一层SwipeRefreshLayout,这样RecyclerView就自动拥有下拉刷新功能了。接下来在代码中处理具体的刷新逻辑,修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity {
...
@InjectView(R.id.swipe_refresh)
SwipeRefreshLayout swipeRefresh;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
dialog = ProgressDialog.show(this, null, "玩命加载中.....");
getMessage();
//下拉刷新
swipeRefresh.setColorSchemeResources(R.color.myColor);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
getMessage();
swipeRefresh.setRefreshing(false);
}
});
}
...
}
这段代码还是比较好理解的,首先通过butterknife拿到SwipeRefreshLayout的实例,然后调用setColorSchemeResoutces()方法来设置下拉刷新进度条的颜色,然后调用setOnRefreshListener()方法来设置一个下拉刷新的监听器,当触发了下拉刷新操作时就会回调这个监听器的onRefresh()方法,然后在这里处理具体的刷新逻辑就可以了。最后调用SwipeRefreshLayout的setRefreshing()方法并传入false,用于表示刷新事件结束,并隐藏刷新进度条。