android下拉刷新视频,083-下拉刷新-SwipeRefreshLayout

SwipeRefreshLayout就是用于实现下拉刷新功能的核心类, 它是由support-v4库提供的。

我们把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout中, 就可以迅速让这个控件支持下拉刷新。

那么在MaterialTest项目中, 应该支持下拉刷新功能的控件自然就是RecyclerView了。

由于SwipeRefreshLayout的用法也比较简单, 下面我们就直接开始使用了。 修改activity_main.xml中的代码, 如下所示:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/drawer_layout"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent">

...

android:id="@+id/swipe_refresh"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:id="@+id/recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent" />

...

...

可以看到, 这里我们在RecyclerView的外面又嵌套了一层SwipeRefreshLayout, 这样RecyclerView

就自动拥有下拉刷新功能了。 另外需要注意, 由于RecyclerView现在变成了SwipeRefreshLayout的子控件, 因此之前使用app:layout_behavior 声明的布局行为现在也要移到SwipeRefreshLayout中才行。

不过这还没有结束, 虽然RecyclerView已经支持下拉刷新功能了, 但是我们还要在代码中处理具体的刷新逻辑才行。 修改MainActivity中的代码, 如下所示:public class MainActivity extends AppCompatActivity {

...

private SwipeRefreshLayout swipeRefresh;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

...

swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);

swipeRefresh.setColorSchemeResources(R.color.colorPrimary);

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

@Override

public void onRefresh() {

refreshFruits();

}

});

}

private void refreshFruits() {

new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

runOnUiThread(new Runnable() {

@Override

public void run() {

initFruits();

adapter.notifyDataSetChanged();

swipeRefresh.setRefreshing(false);

}

});

}

}).start();

}

...

}

这段代码应该还是比较好理解的, 首先通过findViewById() 方法拿到SwipeRefreshLayout的实例, 然后调用setColorSchemeResources() 方法来设置下拉刷新进度条的颜色,

这里我们就使用主题中的colorPrimary作为进度条的颜色了。 接着调用setOnRefreshListener() 方法来设置一个下拉刷新的监听器, 当触发了下拉刷新操作的时候就会回调这个监听器的

onRefresh() 方法, 然后我们在这里去处理具体的刷新逻辑就可以了。

通常情况下, onRefresh() 方法中应该是去网络上请求最新的数据, 然后再将这些数据展示

出来。 这里简单起见, 我们就不和网络进行交互了, 而是调用一个refreshFruits() 方法进

行本地刷新操作。 refreshFruits() 方法中先是开启了一个线程, 然后将线程沉睡两秒钟。

之所以这么做, 是因为本地刷新操作速度非常快, 如果不将线程沉睡的话, 刷新立刻就结束

了, 从而看不到刷新的过程。 沉睡结束之后, 这里使用了runOnUiThread() 方法将线程切换

回主线程, 然后调用initFruits() 方法重新生成数据, 接着再调用FruitAdapter的

notifyDataSetChanged() 方法通知数据发生了变化, 最后调用SwipeRefreshLayout的

setRefreshing() 方法并传入false , 用于表示刷新事件结束, 并隐藏刷新进度条。

a4461abd874b610e2502588ef095b7f9.png